はじめに
今回はOSチューニングについて寄稿します。プロバイダの品質が高く、ハードウェアのスペックも高いことが前提です。
最終的な詰めであるので連載の全てを読んだことを前提とします。
レジストリの編集がメインなので意味を深く理解してからチューニングしましょう。
対象とする読者
1.Windows7でとにかく最小遅延を目指す2.1Gbps以上の回線を契約している
3.ルータやNICも問題がない
4.レジストリの編集に抵抗がなく、万一の際も自分で修復可能
TCP処理先をNICからCPUに変更する
XPまでのOSの場合、TCPに関する処理(例えば、パケットが届いた順番の管理や、正しいデータが届いたかのチェック)を全てCPUで行っていました。一方、最近のOSとNICの組み合わせではこの処理をNIC側にさせることでCPU負荷を下げています。
しかし、通信量がNICの処理速度を超えるとNICが処理しきれずに遅延やパケットロスをする可能性が出てきます。
これに対処するために、TCP処理のオフロード無効化を施します。
※一部のIPやホスト名は*にマスクしています。
C:\Users\YukiKaki> reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /f /v DisableTaskOffload /t REG_DWORD /d 1 C:\Users\YukiKaki> reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters ICSDomain REG_SZ mshome.net SyncDomainWithMembership REG_DWORD 0x1 NV Hostname REG_SZ ******** DataBasePath REG_EXPAND_SZ %SystemRoot%\System32\drivers\etc NameServer REG_SZ ForwardBroadcasts REG_DWORD 0x0 IPEnableRouter REG_DWORD 0x0 Domain REG_SZ Hostname REG_SZ ******** SearchList REG_SZ UseDomainNameDevolution REG_DWORD 0x1 EnableICMPRedirect REG_DWORD 0x1 DeadGWDetectDefault REG_DWORD 0x1 DontAddDefaultGatewayDefault REG_DWORD 0x0 EnableWsd REG_DWORD 0x1 QualifyingDestinationThreshold REG_DWORD 0x3 MaxUserPort REG_DWORD 0xfffe TcpTimedWaitDelay REG_DWORD 0x1e StrictTimeWaitSeqCheck REG_DWORD 0x1 EnableIPAutoConfigurationLimits REG_DWORD 0x1 ReservedPorts REG_MULTI_SZ 1433-1434 DnsOutstandingQueriesCount REG_DWORD 0x3e8 EnableTCPA REG_DWORD 0x0 DisableTaskOffload REG_DWORD 0x1 Tcp1323Opts REG_DWORD 0x0 EnableDca REG_DWORD 0x0 DhcpNameServer REG_SZ ***.***.***.*** C:\Users\YukiKaki> |
うまくDisableTaskOffloadが追加できていれば、TCP処理のオフロード無効化が出来ています。
TCPパラメータをチューニング(ウインドウサイズの変更と余計な機能の無効化)
ウインドウサイズの変更とは、 一度に送受信するデータのサイズを変更することです。ここではウインドウサイズを拡大し、その他余計な機能を全て無効にしています。
※一部のIPやホスト名は*にマスクしています。
C:\Users\YukiKaki> netsh
interface tcp set global rss=disabled chimney=disabled
autotuninglevel=highlyrestricted congestionprovider=none
ecncapability=disabled timestamps=disabled netdma=disabled dca=disabled C:\Users\YukiKaki> netsh interface tcp show global アクティブ状態を照会しています... TCP グローバル パラメーター ---------------------------------------------- Receive-Side Scaling 状態 : disabled Chimney オフロード状態 : disabled NetDMA 状態 : disabled Direct Cache Acess (DCA) : disabled 受信ウィンドウ自動チューニング レベル : highlyrestricted アドオン輻輳制御プロバイダー : none ECN 機能 : disabled RFC 1323 タイムスタンプ : disabled ** 上の autotuninglevel 設定は、少なくとも 1 つのプロファイルのローカル/ポリシー構成を 上書きするウィンドウ スケーリング ヒューリスティックの結果です。 C:\Users\YukiKaki> |
netsh interface tcp show global の結果が同じになっていればうまく反映されています。
ただし、これは一例です。
相手側の環境が最良でない場合は、congestionprovider=ctcpや、timestamps=enabledが好ましい場合もあります。
これらのパラメータを編集する際は マイクロソフトの公式情報 を参照して意味を理解しましょう。
TCPパラメータをチューニング(TcpAckFrequency)
通称TAFの名称で、ネトゲ界隈では有名なチューニングです。余りに有名なのでゆとり溢れるツールも出ていますが、本記事の読者はどこを編集するか知ることが目的の人が多いので、全ての編集はコマンドラインで行います。
①初めに、wmic nic getコマンドでインタフェースGUIDを確認します。(赤字部分)
※一部のIPやホスト名は*にマスクしています。
C:\Users\YukiKaki> wmic nic get "GUID" , "NetConnectionID" GUID NetConnectionID {46740908-ABB6-46D1-A48C-AA5A7E72E296} ローカル エリア接続 {2D320EBC-8F7A-4ACE-9ADC-48E6AEC2FC97} ワイヤレス ネットワーク接続 C:\Users\YukiKaki> |
②レジストリエントリにTcpAckFrequencyを追加します。
赤字部分は"対象のインタフェースGUID"を適宜書き換えましょう。
※一部のIPやホスト名は*にマスクしています。
C:\Users\YukiKaki> reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{46740908-ABB6-46D1-A48C-AA5A7E72E296} /f /v TcpAckFrequency /t REG_DWORD /d 1 C:\Users\YukiKaki> reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{46740908-ABB6-46D1-A48C-AA5A7E72E296} HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{1379B417-12D1-465D-871B-D0590A15E452} UseZeroBroadcast REG_DWORD 0x0 EnableDeadGWDetect REG_DWORD 0x1 EnableDHCP REG_DWORD 0x1 NameServer REG_SZ Domain REG_SZ RegistrationEnabled REG_DWORD 0x1 RegisterAdapterName REG_DWORD 0x0 DhcpIPAddress REG_SZ ***.***.***.*** DhcpSubnetMask REG_SZ 255.255.0.0 DhcpServer REG_SZ ***.***.***.*** Lease REG_DWORD 0x3840 LeaseObtainedTime REG_DWORD 0x508a6c0c T1 REG_DWORD 0x508a882c T2 REG_DWORD 0x508a9d44 LeaseTerminatesTime REG_DWORD 0x508aa44c AddressType REG_DWORD 0x0 IsServerNapAware REG_DWORD 0x0 DhcpConnForceBroadcastFlag REG_DWORD 0x1 TcpAckFrequency REG_DWORD 0x1 DhcpInterfaceOptions REG_BINARY FC000000000000000000000000000000196C8A503B0000000000000004000000000000004CA48A50000031383A0000000000000004000000000000004CA48A5000001C200600000000000000040000 00000000004CA48A50AC100001030000000000000004000000000000004CA48A50AC100001010000000000000004000000000000004CA48A50FFFF0000330000000000000004000000000000004CA48A5000003840360000000000000004000000000000 004CA48A50AC100001350000000000000001000000000000004CA48A5005000000 DhcpGatewayHardware REG_BINARY AC10000106000000003A9DAFF77E DhcpGatewayHardwareCount REG_DWORD 0x1 DhcpNameServer REG_SZ ***.***.***.*** DhcpDefaultGateway REG_MULTI_SZ ***.***.***.*** DhcpSubnetMaskOpt REG_MULTI_SZ ***.***.***.*** C:\Users\YukiKaki> |
ここまで進んだらレジストリの編集結果を反映するために再起動しましょう。
まとめ
本記事では、TCPのパラメータを変更して高速化を図っていますが、他にもTCPパラメータはたくさんあります。http://www.microsoft.com/en-us/download/details.aspx?id=9152
Web上では、ブログなどで「○○のレジストリが~」等の記事がよくあります。
しかし、よく分かっていない人が書いている記事が非常に多いです。
特に、XP用のレジストリをWindows7に適用している意味不明なものが多いです。
Windowsの仕様は、MSDNやTechnetでマイクロソフトが公開しています。
その裏付けを確認している人の記事を参考とするようにしましょう。