[Rust]クライアントとの通信にSteam Networkingを利用する

2023/07 接続に問題が出るため、現在は使わないよう公式からアナウンスが出ています。

Rustはデフォルトでは、RakNetと呼ばれるネットコードを利用してクライアントと通信をしているが、私の環境では、40名程度がサーバーに参加すると、サーバー全体が不安定になる症状が出た。

プレイヤーがサーバーに参加したタイミングで、トラフィックが大きくスパイクしてしまい、ラグが発生するのだ。

ルーター(RTX830)から見たトラフィックのグラフ。
サーバーから見て上りのLAN IN、WAN OUTのトラフィックが大きく振れている。
Rustのプレイヤーリストの一部。ping値が数千になっているクライアントが多数。一方、少数のクライアントは、正常に通信できている
このような不整脈みたいな波形が出てしまうと、
サーバーはほとんど応答しなくなってしまう。

サーバー上のパケット数の制限値を引き上げたりしてみたが効果なし。

いろいろ設定について調べていたところ、2020年10月「エレベーターアップデート」に興味深い開発者の記事を見つけた。

「RakNetはもうメンテナンスされていないし、脆弱性も我々でパッチしなければならないので、解決策としてSteam Networkingをサポートした」というのだ。RakNetはもう枯れすぎた技術なんでしょうかね…

Steam Networkingは、その名の通りValve社によって開発されたネットコード。オープンソース版もGithubにあるようだ。

通信にSteam Networkingを使用するには、サーバー側に下記の設定が必要。

  • 起動時のオプションに、”-swnet“、”-queryport (クエリー用のポート番号)”を指定
  • ルーター側で-queryportで指定したポート番号の開放

使ってみた感想は、「サーバーに入るのが少し大変だけど、一度サーバーに入れれば快適。トラフィックのグラフも安定してる」といった感じ。

ただしいくつか注意点もある。

  • WebRconやserverinfoコマンドで、ネットワークのトラフィックの情報が表示できなくなる
    常に0が返ってくる。
  • サーバー接続時に、「disconnecting: Entities Out Of Order: expected xxxx, received xxxx」が表示される
    これが厄介。多分Rustのバグなんだけど、Rustの公式Discordにも明確な原因や、解決策が載ってない。
    2か月程度運用した限りだと、拠点が密集しているところでログアウトすると、次回の接続時に起きやすくなる模様。
    下記のことを試したところ、サーバーに入れるようになったという報告がある。
    • 再接続
    • Rustの再起動
    • Steamの再起動
    • PCの再起動
    • Steamworks共通再頒布可能コンポーネントの整合性チェック
    • Rustの整合性チェック
    • 管理者がkillplayerコマンドで当該プレイヤーをキルする

「デフォルトがSteam Networkingに変更されない限り、コミュニティーサーバーではRakNetの使用を勧める」ということだが、公式サーバーでは既に使われているのだろうかねえ。

サーバー参加時の大きなラグで困っている管理者がいたら、試してみてほしい。

strongSwanのモダンな方法を使ってVPN環境構築してみた

IKEv2、公開鍵認証、仮想IP使用、Roadwarriorシナリオ。

スマホはAndroid版アプリを使用して接続する。

ネット上にstrongSwanの使い方が載ってる記事は結構あるけど、strokeを使う古い方法のものが多かったので、viciを使った方法で書いてみた。

strongSwanには、モダンなインターフェースである「vici」と、 古いインターフェースである「stroke」の2つのインターフェースが用意されている。現在はviciの方が好ましい(preferred)とされている。

後で時間があれば、クライアントがPCの場合とか、証明書の作成方法とか、もっと詳しく書いていきたいな。

構成図

こんな感じかな?ルーターの内側にVPNゲートウェイがある形。

VPNゲートウェイを通ってLAN内のサーバーやNASにアクセスできるようになる。

LAN内に何台もサーバーやNASがあって、インターネットからSSH等で管理したい時に、ルーターで個別に管理用のポートを開放するよりも、シンプルで安全。

ちなみに私はRaspberry Pi 4でVPNゲートウェイを動かしてます。

構成図(クリックで拡大表示)

設定ファイル(/etc/swanctl/swanctl.conf)

connections {
    ikev2 {
        version = 2
        pools = pool
        local {
            #認証に使うサーバー証明書のFQDNを指定
            #証明書のsubject Distinguished Name、subject Alternative Nameと一致する必要がある
            id = example.com
            
            #サーバー証明書のファイル名を指定。/etc/swanctl/x509/配下の相対パスか、絶対パスで指定
            certs = server-cert.pem    
            auth = pubkey
        }
        remote {
            auth = pubkey
        }
        children {
            child {
                local_ts = 0.0.0.0/0,::/0
            }
        }
    }
}

pools{
    pool{
        #使用する仮想IPのアドレス範囲を指定
        addrs = 192.168.20.0/24
        
        #使用するDNSサーバーを指定
        dns = 192.168.1.1
    }
}

証明書の作成と配置

CA証明書、サーバー証明書、クライアント証明書を作成する。strongSwan付属のipsecコマンドを使うと割と簡単にできる。詳しい作成方法はArchWikiとかにあります。

作成したファイルのうち、CA証明書、サーバーの秘密鍵、 サーバー証明書を下記ディレクトリに配置する。

CA証明書…/etc/swanctl/x509ca/
サーバーの秘密鍵…/etc/swanctl/private/
サーバー証明書…/etc/swanctl/x509/

ファイアウォール/NATの設定

UDPのポート番号500、4500を開放し、VPNゲートウェイ(192.168.1.254)へフォワーディングする。

クライアントの設定

ServerにサーバーのFQDNかIPアドレスを入力。

VPN Typeは「IKEv2 Certificate」を選択。

User Certificateの「INSTALL USER CERTIFICATE」でクライアント証明書をインストールする。PKCS#12形式にしておくと良いでしょう。

CA certificateはSelect automaticallyにチェックを入れる。

4Kでゲームがしたくて非常に苦労した話

多くのメーカーはWQHD(2560×1440ドット)を推してるみたいだけど、 WQHDって中途半端じゃない?まあ4Kは、描画面積がフルHDの4倍もあるから、フルHDからステップアップするにはハードルが高いってところなんだろうけど。

そんなわけで1月にASRock AMD Radeon RX 6800 Challenger Proを買った。

ところが動かしてみると問題が発生。RustをプレイしながらTwitterのタイムラインをスクロールさせると、グラボが落ちるという奇妙な症状に見舞われる。

グラボが落ちるとはどういうことかというと、

  • 突然画面が真っ暗になり、再起動がかかる。
  • ファンが高速回転する。
  • Q-LED(ASUSのマザーボードに付いてる診断用のLED)のVGAの異常を示すLEDが点灯。
  • 電源を入れ直すまで画面が映らなくなる。リセットボタンでは不十分

検証動画も撮りました。字幕に説明が書いてあるので、字幕をONにしてご覧ください。

これは今まで経験したことがない深刻な状況…。

他のベンチマークやゲームで Twitterのタイムラインをスクロールさせると、問題なく動く。何故かRustだけがおかしい。色々回したけど全部問題なし。

下記のようにいろいろ試したけど治らず。

  • ドライバーのアップデート(Display Driver Uninstallerによるクリーンアップを実施)
  • CMOSクリア
  • BIOS(UEFIファームウェア)のアップデート
  • メモリのXMPプロファイルを無効にする
  • 別のPCIeスロットへの差し替え
  • メモリの交換
  • 電源の交換(750W→850W)
  • 別PCへの取り付け
  • モニターの交換

回避策

100%ではないが回避策も見つけた。クロックダウンすると起こりにくくなる。

  1. Radeon Softwareのチューニング設定画面から、チューニングコントロールを「手動」にする
  2. GPUチューニングを「有効」 高度な制御を「有効」 最大周波数を1905MHzに設定
    ※1905MHzはこのボードのゲーム時の実行クロック
  3. 「変更を適用」をクリックして設定を保存

サポートに問い合わせしてみた

購入したショップに問い合わせたら、返金するとの返事が。初期不良として交換にしてほしかったんだけど、在庫がなかったんだろうね。

続いてASRockのサポートに問い合わせるも、切り分けの結果Rustのみで異常が出たため、Rustのサポートに問い合わせろと言われる。

そこで、検証できないかとお願いしてみたけど、Rustを持ってないからできないと一蹴される。

(あの~、RustってSteam上で最もプレイされているマルチプレイヤーゲームの、上位10番以内に入るタイトルなんですけど…)

仕方なく開発元のFacePunchにも問い合わせましたよ。英語で。けど予想通り、他にはそういった症状は出てないという回答が返ってきた。

2枚目購入

Rust以外は問題なく動いていて、手放すのが嫌だったから2枚目を買うことにしました。

5月に買ったのだけれど、マイニング需要のせいで価格が1月と比べて4万円以上上昇という恐ろしい事態に。でもやるしかなかったんだ。

Radeon RX 6800 Phantom Gaming Dを購入。本当は別メーカーにしたかったんだけど、当時の入手のしやすさとデザインで再びASRockのカードに。

2台並べてみる

ところがこれも同じ症状…というか、Challenger Proよりひどい!Rust以外でも落ちた。

もうここまで来たら疑う場所は1か所しか無いと思った。vBIOS(グラボ上にあるBIOS)だ。

2枚目買った直後にvBIOS バージョンL04がリリースされたので、すぐに適用したところ、2枚とも何事もなかったかのように動いた。いやー、長かった。

というわけで、もしこれらの製品をお持ちで、初期のvBIOSのまま調子が悪くて寝かせてる方がいらっしゃったら、まずはvBIOSのバージョンをL04にアップデートすることを試してみて欲しい。

これ、初期不良で返品されまくったんじゃないの?L04にするまでは金返せレベルのひどさだよ?

ちなみにASRockのサポートにvBIOSによって解決した旨連絡をしたんだけど、スルーされた。いい所あるのにサポートは残念だなー。もったいない。

10Gbpsのスイッチ(QSW-M408-4C)導入

10Gbps/マルチギガ対応のスイッチングハブ。前から欲しかったんだけど、ようやく、これだ!というスイッチがあったので買った。まさかQNAPから出てくるとは。10G対応のポートは4ポートだけど、VLANが切れて5万円は安い!

それまではネットギアのXS512EMとか、バッファローのBS-MP2008を買おうかなって考えてた所。

あわせて、メインPCに10G対応NICを導入。通信自体は問題なかったが、一つ問題を発見。困ったことに、スリープから復帰できなくなった。休止状態だと動くんだけど。

…というわけでインテルチップのボードも購入して検証。コンバージドなんちゃらって名前のつく製品初めて買ったわ。しかし症状は改善せず。マザーボードとの相性かな?

Sambaが動いてるサーバーとのベンチマーク結果。

サーバーは既に10Gポートがオンボードで付いてるのでそれをそのまま使用。1Gbpsは超えてるみたいね。だけどWriteの方が早いって…信じて良いのかな??サーバーはRAID1構成。

QSW-M408には、左端にスパナマークのついたポートがあるが、マニュアルやHPでは全く触れられていない。デバッグ用なのだろうか?115200bpsで試しに繋いでみると…。

こいつLinuxで動いてるぞ!

しかもrootユーザーで入れてるってことはやりたい放題なのでは…壊れたら怖いから設定変えなかったけど、もしかしたら色々遊べるのかもしれない。

余談だけどBS-MP2008は、USのサイトを見ると、スイッチングファブリック(表記はBandwidth)が80Gbpsって書いてある。
https://www.buffalo-technology.com/productpage/switch-bs-mp2008/
通常はポート数×帯域の2倍で160Gbpsなんだけど。これが他社機種に比べて安い原因?

メインPCの近況

昨年に引き続き、大晦日更新です…

グラボが来ない

4Kでゲームがしたくなったので、Radeon RX 6800を導入予定。各ショップとも在庫がかなり少ないらしく泣きそう。1月上旬までにお届けってなってて、そこから音沙汰ないんだけど、信じていいのかな。

SSD買い足し

システムのSSDの空きが尽きてしまったので、ゲーム用にSSDを買い足した。性能つよつよのWDのSN850にした。

撮影環境が良くなかったのは許して

ヒートシンクが無いので別途用意した。SilverStoneのTP02-M2にしたところ、厚みがあってパーツに干渉してしまった。残念。

結局、薄型のグラフェン加工された銅のヒートシンクに変更。熱伝導率がすごく良いみたいだけど、実際どうなんだろうね。

マザーボードが対応してるPCIeの世代が古くてスピードが出ず…

PCIe Gen3接続の場合こんな感じ
SN850のReadの公称値が7000MB/sなので、おおよそ半分しか性能が出てないことになる。る。

マザーボードを新しくするためにはCPUも変えなきゃいけない。こりゃ沼だ…