Windows 7のネットワーク設定を標準で使ってはいけない。標準では「SNP(Scalable Networking Pack)」と呼ばれるネットワークを最適化する機能が有効化されている。この「SNPが有効化」されている設定のままPCを動作させると、ネットワーク処理が不安定になったり、ネットワーク処理とは関係ないアプリケーションの処理に影響を与えたりする可能性があるからだ。
SNPとは、通常はPC上のプロセッサが行っているネットワーク処理を、PC内部のNIC(ネットワークインタフェースカード)に担当させるなどしてプロセッサの負荷を下げる機能だ。
ハードにネットワーク処理を分担させるSNP
SNPは三つの機能からなる。「SNPが有効」とは三つのうち、少なくとも一つが有効化していることを指す。
(1)TCP Chimney Offload
TCPのネットワーク制御をプロセッサからNICにオフロード(負荷を軽減)する機能。この機能を有効にすると、大量データの送信処理や、通信データの信頼性をチェックするための値(チェックサム)の計算などを、NIC上のTOE(TCP Offload Engine)と呼ぶモジュールで処理する。プロセッサにかかるネットワーク処理の負荷を軽減できる。
(2)Receive Side Scaling(RSS)
TCPの受信制御を効率化する機能。この機能を有効にすると、通常は一つのプロセッサコアで行う受信制御を、複数のコアが分担して行うようになる。特定のプロセッサコアへの負荷を分散できる。
(3)Network Direct Memory Access(NetDMA)
NICからのメモリーアクセスを効率化する機能。この機能を有効にすると、NICに処理をオフロードしてもプロセッサを経由しなければできなかったメモリーアクセスが、直接できるようになる。プロセッサの負荷の軽減と、NICでの処理の高速化が図れる。
以上のような機能を使うと、プロセッサの負荷を軽減し、ネットワークのパフォーマンスはより最適化されるはずだ。しかし実際には、SNPを有効化すると、特定のネットワーク操作でパフォーマンスが低下するといった不具合が発生するケースが起こっている。また、SNPを有効化していたことで、ネットワークパケットの取りこぼしが発生し、正常に通信できないという問題も発生している。
そのほか、アプリケーションが正常に働かなくなることもある。その背景には、SNPの三つの機能が「カーネルモード」で処理されることがある。カーネルモードとは、Windows 7で管理するすべてのハードウエアに直接アクセスできる高い特権のこと。カーネルモードで動作するということは、メモリーにも自由にアクセスできるということだ。
NICやネットワークドライバが大量のメモリー領域を占有することもできてしまう。もしそうしたことが起これば、メモリーリークが発生したり、アプリケーション用のメモリー領域が不足したりして問題が発生する。
残念ながら現在(2010年9月)のところ、SNPを安心して使える状況にあるとはいえない。今後の改善は見込めるが、システムの安定運用を重視するなら、当面はSNPの利用を避けたほうがよさそうだ。どうしても使いたい場合は、ハードウエアベンダーが提供しているネットワークドライバやNICが正常に作動し、さらにそれらとマイクロソフトが提供するWindows 7との連携がうまくいくかどうかを検証しておこう。
コマンドでSNPを無効化
SNPを無効化するには、まずSNPがシステムで使用されているのかどうか確認するところから始める。Windows 7の「コマンドプロンプト」で以下のコマンドを入力すると、SNPの各機能が有効化されているかどうかを確認できる。
netsh int tcp show global
確認するのは、「Receive-Side Scaling状態」「Chimney オフロード状態」「NetDMA 状態」の三つだ(図1)。ここが「enabled」「automatic」となっていたら、有効になっていることを示す。有効になっていると分かったら、コマンドプロンプトに以下のコマンドを使用してSNPを無効化する。

・TCP Chimney Offload の無効化
netsh int tcp set global chimney=disabled
・Receive-Side Scaling(RSS)の無効化
netsh int tcp set global rss=disabled
・Network Direct Memory Access(NetDMA)の無効化
netsh int tcp set global netdma=disabled
上記のコマンドを入力した後は、前述のコマンドでシステムの設定を確認し、状態がいずれも「Disabled」になっていれば無効化が完了する。さらに、ハードウエア側の設定変更も必要になる。ハードウエアベンダーが提供する情報を参考にして無効化するのも忘れずに行おう。
日本ヒューレット・パッカード株式会社 テクノロジーサービス事業統括 サポートデリバリ統括本部 グローバルソリューションセンター本部 ミッションクリティカルサポート二部 コンサルタント