Introduction
備忘録。
クロスケーブルでつないだマシン同士の通信速度を計測したくなった。
というのも、片方は NIC、もう片方は USB 3.0 Type-A の USB-LAN コネクタを使っており、想定した速度が出ていないような気がしたため。
事実、軽量高速と謳われるリモートデスクトップアプリ Brynhildr Free でも FPS が出ておらずラグがひどい。
そのため、問題の切り分けのための証拠集め。
How to do?
Microsoft の公式記事 Windows VM または Linux VM でスループットをテストする にて、公式ツール NTTTCP が紹介されているのでこれに従う。
1. 送信側、受信側共通の作業
NTTTCP の Release から v5.39 をダウンロードして受信側、送信側に配置。
v5.40 はバグがあるのか、後述の Throughput
が常に 0 になってしまう問題があり、Issue が上がっている。
per-thread throughput is always 0.00 with ntttcp version 5.40. #24
今回はダウンロードフォルダにそのまま配置。
2. 受信側の準備
ファイアウォールを許可する。
管理者権限でコマンドプロンプトを起動し下記を実行。
1 | $ netsh advfirewall firewall add rule program="%HOMEPATH%\Downloads\ntttcp.exe" name="ntttcp" protocol=any dir=in action=allow enable=yes profile=ANY |
そして、受信側で NTTTCP を起動。
1 | $ ntttcp -s -m <number of threads>,*,<receiver IP address> -t <runtime in seconds> |
今回は下記のようにした。
1 | $ ntttcp -r -m 4,*,192.168.1.173 -t 300 |
3. 計測開始
送信側で NTTTCP を起動。
1 | $ ntttcp -s -m <number of threads>,*,<receiver IP address> -t <runtime in seconds> |
今回は下記のようにした。
1 | $ ntttcp -s -m 4,*,192.168.1.173 -t 300 |
実行ログはこんな感じ
1 | $ ntttcp -s -m 4,*,192.168.1.173 -t 300 |
4. 後始末
ファイアウォールを削除。
1 | $ netsh advfirewall firewall delete name="mtttcp" |
5. 計測結果の解析
ChatGPT 4o にお願いした。
スレッド別の統計
- 4スレッド合計で約31.6MB/s (KB/s合計 = 約31,628KB/s) の送信
- 各スレッドは 11.8秒程度だけ動作
- Avg B / Compl が 65536 → 各送信が64KB単位で行われていた(通常の設定)
✅ 解釈:
一見すると各スレッドは正しく送信していますが、実行時間が11.8秒しかないのに、次のセクションで realtime(s) が 300秒となっているため、実行時間の割に動作していない時間が長いことが示唆されます。
合計統計(Totals)
- 総データ量:352.937MB(=少ない)
- 実行時間:300秒
- 平均フレームサイズ:1417バイト
- 平均スループット:1.176MB/s ≒ 約9.4Mbps
❗問題点:
- スループットが非常に遅く、ネットワーク回線の性能(例えばギガビットイーサ)に比べて極端に低い
- おそらくネットワークまたは ntttcp の設定に問題
バッファ・CPU性能
- 毎秒送信したバッファ数:18.8
- 1バイトあたりにかかっているCPUサイクル:5243 → 非常に高い(通常は数百〜数千)
- バッファ数:5647 → 非常に少ない(たとえば毎秒1000個送れれば十分)
❗注意:
- CPU効率が悪いか、割り込みなどの影響で処理に時間がかかっている
- バッファ送信数も少ない
DPC(遅延プロシージャ呼び出し)と割り込み
- DPCが多いのに、1 DPC あたりのパケット数が少なすぎ(0.096)
- 割り込みも多く、1割り込みで平均0.019パケットしか処理できていない → 効率が非常に悪い
❗解釈:
- 割り込みが頻繁に発生しているが、毎回の処理が非効率
- NAPIや割り込みのcoalescingが無効になっている可能性がある
パケット統計とCPU使用率
- 再送(Retransmits):21 → 少なめ(通信品質はそれほど悪くない)
- Errors(通信エラー):222 → 少し多いが致命的ではない
- CPU使用率:24% → ボトルネックにはなっていないように見える
🧭 総合評価と対処のヒント
✳ 現象:
- テスト実行時間は300秒だが、実際のデータ転送は開始後すぐに終わってしまい、残り時間はほぼアイドル状態
- トータルのスループットが非常に低い(1.1MB/s)
- DPC/割り込みが非効率で、バッファ処理数も少ない
6. 改善
-t
を20
にすればスループットが、10.8MB/s(≒86.6Mbps)まで改善- USB 3.0 (理論値 5.0 Gbps)、1 Gbps の LAN なら、もっと速度が出ても良いような気もする。
-t
を省略し、スレッド数1 (ntttcp -s -m 1,*,192.168.1.173
) にしたら、41.264 MB/s (≒ 330Mbps)まで改善- ジャンボフレームを有効にしたら 11.2MB/s まで下がった
- 受信側が 4014 bytes、送信側が 4 KB という違いが影響?
- ジャンボフレームを有効にしたら 11.2MB/s まで下がった