Microsoft NTttcpを利用したNW帯域幅/スループットの測定(WindowsとUbuntu間)

Microsoftが提供しているネットワーク帯域計測ツール、**NTttcp**を利用したスループット計測を実施します。

# ■環境
**windows**（IPアドレス：192.168.142.71）
```
OS 名:                 Microsoft Windows Server 2016 Standard Evaluation
OS バージョン:          10.0.14393 N/A ビルド 14393
```

**ubuntu**（IPアドレス：192.168.142.53）
```
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy
```

# ■Windows側の準備
Windows側のNTttcp利用については、実行ファイルを配置するだけでOKです。

以下githubにアクセスして、`ntttcp.exe`をダウンロードします。

https://github.com/microsoft/ntttcp/releases/tag/v5.39

適当なディレクトリに配置します。
今回は`C:\tools`に配置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/efead2b4-8160-7371-bc1a-449e3fe2f7b5.png)

:::note warn
当環境ではWindowsファイアーウォールを停止しています。
必要に応じてファイアーウォールの穴あけ等は実施してください。
（NTttcp利用するポートはデフォルトではTCP5001,5002）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/ff373ff4-109a-d9ab-daaa-b633fbb35857.png)
:::


# ■Ubuntu側の準備
Ubuntu側ではパッケージのインストール、資材をgitからダウンロード、資材をmakeします。

まずはパッケージのインストールを行います。
`sudo apt-get -y install build-essential`
`sudo apt-get -y install git`

続いてgitからのダウンロードを行います。
`git clone https://github.com/Microsoft/ntttcp-for-linux`

最後にmakeを行います。
`cd ntttcp-for-linux/src`
`make && make install`

:::note warn
make時に以下エラーが表示される場合、`/usr/local/bin/`ディレクトリのパーミッション設定を追加します。
```text:エラー
cp ntttcp /usr/local/bin/
cp: cannot create regular file '/usr/local/bin/ntttcp': Permission denied
make: *** [Makefile:48: install] Error 1
```

```text:追加対応
$ sudo chmod 777 /usr/local/bin
$ make && make install
```
:::

:::note warn
当環境ではufwを停止しています。
必要に応じてファイアーウォールの穴あけ等は実施してください。
（NTttcp利用するポートはデフォルトではTCP5001,5002）
```text:ufw
$ systemctl status ufw
○ ufw.service - Uncomplicated firewall
     Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Fri 2023-05-12 09:04:17 JST; 10s ago
```
:::


# ■計測(Windows→Ubuntu)
Windowsを送信側、Ubuntuを受信側として計測を行います。
（Windowsはコマンドプロンプトを起動してコマンドを打ちます）

**Windows(送信側)**
`C:\tools\ntttcp.exe -s -m 2,*,192.168.142.53 -t 60 -ns`

**Ubuntu(受信側)**
`ntttcp -r -m 2,*,192.168.142.53 -t 60 -N`

:::note info
オプションは以下の通りです。
`-s`　送信側指定
`-r`　受信側指定
`-m`　マッピング、 <使用スレッド数>,<スレッド番号>,<受信IPアドレス> を定義
`-t`　計測時間
`-ns`　windows側で、Linuxと通信する際のおまじない
`-N`　Linux側で、Windowsと通信する際のおまじない
:::


Windows側では`415.753MB/s`(3.326Gbps)、Ubuntu側では`3.49Gbps`の速度を確認できました。

```text:Windows
C:\tools>C:\tools\ntttcp.exe -s -m 2,*,192.168.142.53 -t 60 -ns
Copyright Version 5.39
Network activity progressing...

Thread  Time(s) Throughput(KB/s) Avg B / Compl
======  ======= ================ =============
     0   60.003       194272.953     65536.000
     1   60.002       231473.884     65536.000

#####  Totals:  #####
   Bytes(MEG)    realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
    24947.125000      60.005       1456.364          415.753

Throughput(Buffers/s) Cycles/Byte       Buffers
===================== =========== =============
             6652.055      15.554    399154.000

DPCs(count/s) Pkts(num/DPC)   Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
     4988.850         0.964       12824.313          0.375

Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
    17961821           288571        1040      0     99.953

C:\tools>
```

```text:Ubuntu
$ ntttcp -r -m 2,*,192.168.142.53 -t 60 -N
NTTTCP for Linux 1.4.0
---------------------------------------------------------
08:14:13 INFO: 2 threads created
08:15:16 INFO: Test run completed.
08:15:16 INFO: Test cycle finished.
08:15:16 INFO: #####  Totals:  #####
08:15:16 INFO: test duration    :60.00 seconds
08:15:16 INFO: total bytes      :26157842432
08:15:16 INFO:   throughput     :3.49Gbps
08:15:16 INFO:   retrans segs   :0
08:15:16 INFO: cpu cores        :2
08:15:16 INFO:   cpu speed      :3392.302MHz
08:15:16 INFO:   user           :0.76%
08:15:16 INFO:   system         :32.78%
08:15:16 INFO:   idle           :41.34%
08:15:16 INFO:   iowait         :0.00%
08:15:16 INFO:   softirq        :25.12%
08:15:16 INFO:   cycles/byte    :9.13
08:15:16 INFO: cpu busy (all)   :86.80%
---------------------------------------------------------
$
```




# ■計測(Ubuntu→Windows)
Ubuntuを送信側、Windowsを受信側として計測を行います。
（Windowsはコマンドプロンプトを起動してコマンドを打ちます）

**Ubuntu(送信側)**
`ntttcp -s -m 2,*,192.168.142.71 -t 60 -N`

**Windows(受信側)**
`C:\tools\ntttcp.exe -r -m 2,*,192.168.142.71 -t 60 -ns`


:::note info
オプションは以下の通りです。
`-s`　送信側指定
`-r`　受信側指定
`-m`　マッピング、 <使用スレッド数>,<スレッド番号>,<受信IPアドレス> を定義
`-t`　計測時間
`-ns`　windows側で、Linuxと通信する際のおまじない
`-N`　Linux側で、Windowsと通信する際のおまじない
:::


Windows側では`327.152MB/s`(2.617Gbps)、Ubuntu側では`2.75Gbps`の速度を確認できました。

```text:Windows
C:\tools>C:\tools\ntttcp.exe -r -m 2,*,192.168.142.71 -t 60 -ns
Copyright Version 5.39
Network activity progressing...
ERROR: DoSendsReceives failed: Unexpected disconnect
ERROR: DoSendsReceives failed: error in send/recv
ERROR: StartSenderReceiver in thread: 0 failed: error in send/recv
ERROR: DoWork failed: one or more worker threads failed
ERROR: main failed: one or more worker threads failed

Thread  Time(s) Throughput(KB/s) Avg B / Compl
======  ======= ================ =============
     0   60.010       275872.955     64998.272
     1   60.015        59204.188     64996.065

#####  Totals:  #####
   Bytes(MEG)    realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
    19636.987663      60.024      57341.820          327.152

Throughput(Buffers/s) Cycles/Byte       Buffers
===================== =========== =============
             5234.430      18.563    314191.803

DPCs(count/s) Pkts(num/DPC)   Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
      496.351        12.053        6292.259          0.951

Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
       50127           359090           0      0     93.869

C:\tools>
```

```text:Ubuntu
$ ntttcp -s -m 2,*,192.168.142.71 -t 60 -N
NTTTCP for Linux 1.4.0
---------------------------------------------------------
08:00:52 INFO: Starting sender activity (no sync) ...
08:00:52 INFO: 2 threads created
08:00:52 INFO: 2 connections created in 2777 microseconds
08:01:52 INFO: Test run completed.
08:01:52 INFO: Test cycle finished.
08:01:52 INFO: 2 connections tested
08:01:52 INFO: #####  Totals:  #####
08:01:52 INFO: test duration    :60.02 seconds
08:01:52 INFO: total bytes      :20595081216
08:01:52 INFO:   throughput     :2.75Gbps
08:01:52 INFO:   retrans segs   :943
08:01:52 INFO: cpu cores        :2
08:01:52 INFO:   cpu speed      :3392.302MHz
08:01:52 INFO:   user           :0.40%
08:01:52 INFO:   system         :14.80%
08:01:52 INFO:   idle           :77.73%
08:01:52 INFO:   iowait         :0.03%
08:01:52 INFO:   softirq        :7.04%
08:01:52 INFO:   cycles/byte    :4.40
08:01:52 INFO: cpu busy (all)   :37.76%
---------------------------------------------------------
$
```



# ■その他(オプション)

:::note warn
Windows版とLinux版でオプションが微妙に異なるので、`-h`オプションを利用してオプションを確認することを推奨します。
:::

`-h`　オプションを表示します。

`-s`　送信側指定
`-r`　受信側指定
`-m`　マッピング、 <使用スレッド数>,<スレッド番号>,<受信IPアドレス> を定義
`-t`　計測時間
`-ns`　windows側で、Linuxと通信する際のおまじない(非同期オプション)
`-N`　Linux側で、Windowsと通信する際のおまじない(非同期オプション)

`-6`　IPv6モード
`-u`　UDPモード
`-p`　送信先ポート指定
`-B`　帯域制限
`-V`　詳細出力


# ■さらにその他(-Nと-ns)
公式では以下のように、非同期オプションである`-N`と`-ns`についてどちらか片方でもよいような記載になっています。

>Windows VM と Linux VM の間で NTTTCP スループット テストを実行するには、Windows の -ns フラグまたは Linux の -N フラグを使用して同期なしモードを有効にします。
https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-bandwidth-testing?tabs=linux


こちらについて念のため確認してみましたが、結論から言うと**両方とも非同期オプションを付けた方が正しく取得できます。**

### ①両方付けた場合
速度結果は送信側・受信側ともに表示されます。
何回か実施し、またWindowsとLinuxで送信と受信を逆にしてみても毎回同じような結果になるのでおそらく正しいやり方になると思われます。

### ②片方だけでつけた場合
片方だけ付ける場合は、（送信側 or 受信側） *　（Windows or Linux）で4パターン存在します。
結果表示は送信側だけ、受信側だけ、などとまちまちです。

結果的に、**送信側にオプションを付けず、受信側だけにオプションを付けた場合は失敗します。**
また、送信側に付けた場合も、**送信側がLinuxの場合は非常に低速な結果が返却されます。**
（通常2～3Gbpsのところ、600Kbpsなどと結果が返されています）

逆にいうと、Windowsを送信側としてオプションを付け、Linuxを受信側としてオプションを付けないケースでしか正しく速度計測できませんでした。

### ③オプションを付けない場合
非推奨なので言うまでもありませんがうまくいきません。
エラーが出て開始できなかったり、永久に待ちになります。

なお、Windows同士が送信・受信の場合は成功します。




# ■参考
https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-bandwidth-testing?tabs=linux

https://qiita.com/Higemal/items/93af04f9bbdc8b681c0b