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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ ntttcp -s -m 4,*,192.168.1.173 -t 300
Copyright Version 5.39
Network activity progressing...


Thread Time(s) Throughput(KB/s) Avg B / Compl
====== ======= ================ =============
0 11.800 5873.898 65536.000
1 11.800 10321.356 65536.000
2 11.799 9899.144 65536.000
3 11.800 4534.237 65536.000


##### Totals: #####


Bytes(MEG) realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
352.937500 300.009 1417.655 1.176


Throughput(Buffers/s) Cycles/Byte Buffers
===================== =========== =============
18.823 5243.692 5647.000


DPCs(count/s) Pkts(num/DPC) Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
2802.219 0.096 14057.058 0.019


Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
261052 80490 21 222 23.837

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. 改善

  • -t20 にすればスループットが、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 という違いが影響?