NForceギガビットネットワークアダプターを搭載したAcerAspireR1600-U910Hを持っています。最大TCPスループットは約25MB/sであり、明らかにシングルコアIntel Atom 230;最大スループットに達すると、 CPU使用率は約50%〜60%であり、これはハイパースレッディング対応のCPUであることを考慮すると、完全な使用率に相当します。
同じ問題がWindows XPとUbuntu8.04の両方で発生します。Windowsでは、最新のnForceチップセットドライバーをインストールし、省電力機能を無効にし、チェックサムオフロードを有効にしました。Linuxでは、デフォルトのドライバーチェックサムオフロードが有効になっています。NvidiaのWebサイトで利用できるLinuxドライバーはありません。
ethtool -k eth0
は、チェックサムオフロードが有効になっていることを示しています。
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp segmentation offload: on
udp fragmentation offload: off
generic segmentation offload: off
以下は、ネットワークがアイドル状態のときのpowertop
の出力です。
Wakeups-from-idle per second : 61.9 interval: 10.0s
no ACPI power usage estimate available
Top causes for wakeups:
90.9% (101.3) <interrupt> : eth0
4.5% ( 5.0) iftop : schedule_timeout (process_timeout)
1.8% ( 2.0) <kernel core> : clocksource_register (clocksource_watchdog)
0.9% ( 1.0) dhcdbd : schedule_timeout (process_timeout)
0.5% ( 0.6) <kernel core> : neigh_table_init_no_netlink (neigh_periodic_timer)
そして、約25MB/sの最大スループットに達したとき:
Wakeups-from-idle per second : 11175.5 interval: 10.0s
no ACPI power usage estimate available
Top causes for wakeups:
99.9% (22097.4) <interrupt> : eth0
0.0% ( 5.0) iftop : schedule_timeout (process_timeout)
0.0% ( 2.0) <kernel core> : clocksource_register (clocksource_watchdog)
0.0% ( 1.0) dhcdbd : schedule_timeout (process_timeout)
0.0% ( 0.6) <kernel core> : neigh_table_init_no_netlink (neigh_periodic_timer)
1秒あたり20000の割り込みに注意してください。これがCPU使用率が高くスループットが低い原因である可能性がありますか?もしそうなら、どうすれば状況を改善できますか?
参考までに、ネットワーク内の他のコンピューターは通常、50 + MB/sで問題なく転送できます。 Core 2 CPUを搭載したコンピューターは、110MB /秒で転送する場合、1秒あたり5000回の割り込みしか生成しません。割り込みの数は、Atomシステムの約20分の1です(割り込みがスループットに比例してスケーリングする場合)。
TCPウィンドウサイズを大きくすると問題は解決しますか?それはOSの一般的な設定ですか、それともアプリケーション固有ですか?
そしてマイナーな質問:eth0に使用されているドライバーを見つけるにはどうすればよいですか?
ネットワークカードのバッファはかなり小さく、割り込みモードで動作しているようです。NIC&ドライバでサポートされている場合は、ポーリングに切り替えることでスループットを向上できる可能性があります。
ただし、より大きなバッファを使用してNICに切り替えることなく、問題を完全に解決できない可能性があります。これは、そのハードウェアではおそらく不可能です。
Eth0に使用されているドライバーを確認するにはどうすればよいですか?
dmesgの出力を調べると役立つ場合があります。
これは私が答えをタイプするこのコンピュータで私が得る特定のケースです:
$ dmesg | grep ethernet
forcedeth: Reverse Engineered nForce ethernet driver. Version 0.62.
場合によっては、NICサポートは(モジュールとしてではなく)カーネルに直接組み込まれます。したがって、少なくともlsmodの出力には表示されません。
TCP Optimizer を使用してみてください。最適化された推奨事項を選択すると、デフォルトのインストールTCP設定よりもスループットが一貫して向上します。