ネットワークチューニング等でStellar Impact 問題の解決を図ってみた

 正直、今の状態でゲームを続けるのは苦痛MAXです。けれども、国内で問題がまったく発生していない人もいるので、問題解決するべく調査、設定変更を行いました。
 (途中から手段と目的が入り交じっていぢくって遊んでる感じになってきたんですよねぇ、これが正しい連休の過ごし方なのか???)

いろいろとやった末の効果、Stellar Impactではサーバーの状態に大きく左右されるため定形的な効果不明。

 昨日設定後の環境でプレイしたところ、回線切断回数は減りましたが、蛇行回転は健在、今日はどうなるかわからないです。逆に今まで問題が発生していなかった人でも一昨日問題の現象が発生したようです(その後、事前予告なくサーバー不通になり、あれ?メンテナンスになっちゃったの?聞いてねーよー状態になりました)など、Stellar Impactはサーバーまわりがかなりプアな状態です。
 Stellarに関しては、まずは北米にもサーバーを設置してくれって感じです。人柱でも構わないという方は、買ってあげてください。売上が上がれば環境が改善される可能性が多少なりとも増えると思います。

もし下記の設定変更内容は行う場合、自己責任で行ってください。設定後に問題が生じても責任は負いません。また、効果も保証しません。

  • UnityのVersion UP

 Stellar ImpactのエンジンはUnityを使っている。http://unity3d.com/webplayer/ このページでエンジンのverが分かる。3.4だったので、最新の3.5に上げてみた。野良プレイしてみたところ回線の切断、船の蛇行、回転は減りましたが、これも早朝に行った作業なので1同様解決したとは言えないです。

  • 正常に動いているフレの回線に乗っかってみる

 正常に動いているフレの好意で、フレのルータのVPNパススルーでプレイしてみたところ、多少の蛇行はあったものの、艦の回転、回線切断は発生しませんでした。経路のトレースをとってみたところフレのルータ経由のほうがホップ数は少なかったです。うちは、NTTやKDDI系など海外へのバックボーンを持ったキャリアじゃないので、NTT系のキャリアを使ってるフレとはこのあたりの違いが出ている感じです。


 ネットに差があるのは確かなんですが、その影響がここまで大きく出てしまうのは、ステラのサーバー環境やアプリの問題なんでしょうね。せめて北米にサーバーがあればなぁとは思います。とりあえず今できることはネットワークのスループット改善程度なので、その方策を調べていくことにしました。


1.NICのドライバ更新
 うちのNICはマザー搭載のMarvell 88E8056。MarvellのNICはあまり評判はよろしくはないが、これまでGfWL以外では特に問題はなかった。結構ドライバも新しいの替えてたが、また新しいのが出てたのでいちおうアップデートしてみました。


2.TCPのレイテンシィを低減する
 これはMMOでは前からよく使われている技のようですが、TcpAckFrequency、TCPNoDelay、TcpDelAckTicksをレジストリ変更で設定することでpingを下げることができるようです。ただしNICやCPUへの負荷は増えます。
 経路が長くてもレイテンシィを低減でレスポンスが上がれば解決に貢献する、はずですが・・・

 以外にもTcpAckFrequencyとTCPNoDelayでググるといっぱい設定方法の記載が出てきます。


3.SNPの無効化
 結構昔からあってネットワークチューニングの基本的なものかもしれないけど、SNP(Scalable Networking Pack)を無効化することでネット関連の問題が解決されたり安定化することがあるらしい。下記のリンクを見ればSNPがどんなものか詳しく分かると思うけど、簡単に言うと10Gbpsが必要な環境で効果が出るもので、まだ枯れた技術でなく問題を引き起こす場合もあるらしいので、一般的な個人ユーザーでは無効化するほうが安定性が高くなるらしいということで、下記のリンクを見てSNPの無効化を行いました。


4.MTUの調整
 下記のリンクを見てMTUを初期値の1500から1448に変更しました。回線速度が遅いXP時代ではよくやられていたことですが、最近は以前ほど一般的ではないかもしれません。ただ、MTUの値を変更できないルータでネットにPPPoE接続している場合MTU調整を行なっていないと、Windows7のMTUは初期値の1500のままでPPPoEのヘッダ分を減じる調整がなされないため、サイズ超過でパケット分割(IPフラグメンテーション)が発生します。これへのサイトの対応は様々で、DoS攻撃対策としてパケットを破棄するところすらあります(長大なパケットを大量に送ってサーバー/ルータ側でのパケット分割、並び替え、結合などで過負荷にさせるケース)。うちのルータ(NEC WR6600H)ではMTUの変更はできなかったので、PC側で変えました。


5.おまけ:その他関連リンク

各サイトいろいろと書いていますが、環境(PC性能、回線、ルータ、NIC)によって左右されるようで、ばらつきが見られました。

最終的にうちの環境で施した設定は

  • netsh設定

netsh int tcp set global rss=disabled
netsh int tcp set global chimney=disabled
netsh int tcp set global netdma=disabled
netsh int tcp set global congestionprovider=ctcp
netsh int tcp set global timestamps=enabled


netsh int tcp show global (参照コマンド)


TCP グローバル パラメーター

                                                                                          • -

Receive-Side Scaling 状態 : disabled
Chimney オフロード状態 : disabled
NetDMA 状態 : disabled
Direct Cache Acess (DCA) : disabled
受信ウィンドウ自動チューニング レベル : normal
アドオン輻輳制御プロバイダー : ctcp
ECN 機能 : disabled
RFC 1323 タイムスタンプ : enabled


netsh int ipv4 show sub (参照コマンド)
netsh int ipv4 set sub "ローカル エリア接続" mtu=1448 store=persistent


MTU MediaSenseState 受信バイト 送信バイト インターフェイス
------ --------------- ----------- ---------- -----------------
4294967295      1      0     3494 Loopback Pseudo-Interface 1
1448        1   4926477   1327389 ローカル エリア接続


注)netshは管理者権限がないとはじかれるので、C:\Windows\System32\cmd.exe の管理者権限付きショートカットを作っておくと便利かも。

  • レジストリ変更
    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{NIC-id}
      • TcpAckFrequency=1 (DWORD)
      • TCPNoDelay=1 (DWORD)
      • TcpDelAckTicks=0 (DWORD)
    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\Parameters
      • TCPNoDelay=1 (DWORD)