出自https://www.brinnatt.com/social/%e7%ac%ac-4-%e7%ab%a0-netperf-%e7%bd%91%e7%bb%9c%e6%b5%8b%e8%af%95/
Netperf 是由惠普公司開發的,測試網絡棧。即測試不同類型的網絡性能的 benchmark 工具,大多數網絡類型 TCP/UPD 端對端的性能,得到網絡上不同類型流量的性能參數。Netperf 根據應用的不同可以進行不同模式的網絡性能測試,即:批量數據傳輸模式和請求/應答模式。
Netperf 測試結果所反映的是一個系統能夠以多快的速度向另外一個系統發送數據,以及另外一個系統能夠以多快的速度接收數據。
工作原理:
Netperf 工具以 client/server 方式工作。server 端是 netserver,用來偵聽來自 client 端的連接,client 端是 netperf,用來向 server 發起網絡測試。在 client 與 server 之間,首先建立一個控制連接,傳遞有關測試配置的信息,以及測試的結果;在控制連接建立並傳遞了測試配置信息以后,client 與 server 之間會再建立一個測試連接,進行來回傳遞特殊的流量模式,以測試網絡的性能。
我自制了一個比較生動點的圖描述這個原理過程:
網絡性能測量的五項指標:
- 可用性(availability):測試網絡性能的第一步是確定網絡是否正常工作,最簡單的方法是使用 ping 命令。通過向遠端的機器發送 icmp echo request,並等待接收 icmp echo reply 來判斷遠端的機器是否連通,網絡是否正常工作。
- Ping 命令有非常豐富的命令選項,比如 -c 可以指定發送 echo request 的個數,-s 可以指定每次發送的 ping 包大小 。
- 響應時間(response time):ping 命令的 echo request/reply 一次往返所花費時間就是響應時間。有很多因素會影響到響應時間,如網段的負荷、網絡主機的負荷、廣播風暴、工作不正常的網絡設備等等。
- 網絡利用率(network utilization):是指網絡被使用的時間占總時間(即被使用的時間+空閑的時間)的比例。
- 網絡吞吐量(network throughput):是指在某個時刻,在網絡中的兩個節點之間,提供給網絡應用的剩余帶寬。網絡吞吐量非常依賴於當前的網絡負載情況。因此為了得到正確的網絡吞吐量,最好在不同時間(一天中的不同時刻,或者一周中不同的天)分別進行測試,只有這樣才能得到對網絡吞吐量的全面認識。
- 網絡帶寬容量(network bandwidth capacity):與網絡吞吐量不同,網絡帶寬容量指的是在網絡的兩個節點之間的最大可用帶寬。這是由組成網絡設備的能力所決定的。
4.1、Netperf 安裝
官網:https://hewlettpackard.github.io/netperf/
下載地址:https://github.com/HewlettPackard/netperf
[root@arm64v8 ~]# git clone https://github.com/HewlettPackard/netperf.git 正克隆到 'netperf'... remote: Enumerating objects: 5252, done. remote: Counting objects: 100% (324/324), done. remote: Compressing objects: 100% (113/113), done. remote: Total 5252 (delta 232), reused 235 (delta 210), pack-reused 4928 接收對象中: 100% (5252/5252), 16.83 MiB | 976.00 KiB/s, 完成. 處理 delta 中: 100% (3928/3928), 完成. [root@arm64v8 ~]# [root@arm64v8 ~]# yum install automake autoconf texinfo gcc -y [root@arm64v8 ~]# cd netperf/ [root@arm64v8 netperf]# ./autogen.sh configure.ac:28: installing './compile' [root@arm64v8 netperf]# [root@arm64v8 netperf]# ./configure [root@arm64v8 netperf]# make && make install
- 默認安裝路徑是 /usr/local 下的各目錄,安裝完以后,會生成兩個工具 netserver 和 netperf。
- 注意:測試過程中服務端和客戶端都需要安裝 netperf,服務端使用 netserver 啟動后,客戶端就可以使用 netperf 來測試網絡的性能。
4.2、Netperf 語法
服務端
服務器端啟動服務,執行 netserver 命令:
[root@brinnatt ~]# netserver Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
-
默認情況下 netserver 開啟端口號為 12865,可以通過以下命令指定服務端口(如果服務端指定端口,則客戶端也需要指定服務器端口):
[root@brinnatt ~]# netserver -D -p 8888
客戶端
客戶端執行 netperf 相關命令即可,netperf 語法格式為:
Usage: netperf [global options] -- [test options]
全局命令行參數包括如下選項:
參數 | 說明 |
---|---|
-H host | 指定遠端運行 netserver 的 server IP 地址 |
-l testlen | 指定測試的時間長度(秒) |
-t testname | 指定進行的測試類型(TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR) |
局部參數包括如下選項:
參數 | 說明 |
---|---|
-s size | 設置本地系統的 socket 發送與接收緩沖大小 |
-S size | 設置遠端系統的 socket 發送與接收緩沖大小 |
-m size | 設置本地系統發送測試分組的大小 |
-M size | 設置遠端系統接收測試分組的大小 |
-D | 對本地與遠端系統的 socket 設置 TCP_NODELAY 選項 |
-r req,resp | 設置 request 和 reponse 分組的大小 |
查看 linux 操作系統 socket 緩沖區大小的默認值,在 /proc 虛擬文件系統中有配置:
tcp
[root@arm64v8 ~]# cat /proc/sys/net/ipv4/tcp_wmem 4096 16384 4194304 // 第一個表示最小值,第二個表示默認值,第三個表示最大值。 // 4kb, 16kb, 4M [root@arm64v8 ~]# cat /proc/sys/net/ipv4/tcp_rmem 4096 131072 6291456 // 第一個表示最小值,第二個表示默認值,第三個表示最大值。 // 4kb, 128kb 6M
- 綜上所述,讀緩沖區默認為 128kb,寫緩沖區默認為 16kb;讀緩沖區最大為 6M,寫緩沖區最大為 4M。
udp
[root@arm64v8 ~]# cat /proc/sys/net/core/rmem_max 2097152 [root@arm64v8 ~]# cat /proc/sys/net/core/wmem_max 2097152 [root@arm64v8 ~]# cat /proc/sys/net/core/rmem_default 2097152 [root@arm64v8 ~]# cat /proc/sys/net/core/wmem_default 2097152
4.3、Netperf 測試
服務端 IP 地址和網卡信息:
[root@brinnatt ~]# ip -4 add show dev enp11s0f0 3: enp11s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 inet 10.47.73.2/24 brd 10.47.73.255 scope global enp11s0f0 valid_lft forever preferred_lft forever [root@brinnatt ~]# [root@brinnatt ~]# ethtool enp11s0f0 Settings for enp11s0f0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: Symmetric Supports auto-negotiation: Yes Supported FEC modes: Not reported Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: Symmetric Advertised auto-negotiation: Yes Advertised FEC modes: Not reported Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on MDI-X: on (auto) Supports Wake-on: pumbg Wake-on: g Current message level: 0x00000007 (7) drv probe link Link detected: yes [root@brinnatt ~]#
客戶端 IP 地址和網卡信息:
[root@arm64v8 ~]# ip -4 add show dev enp11s0f0 3: enp11s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 inet 10.47.73.11/24 brd 10.47.73.255 scope global noprefixroute enp11s0f0 valid_lft forever preferred_lft forever [root@arm64v8 ~]# [root@arm64v8 ~]# ethtool enp11s0f0 Settings for enp11s0f0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: Symmetric Supports auto-negotiation: Yes Supported FEC modes: Not reported Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: Symmetric Advertised auto-negotiation: Yes Advertised FEC modes: Not reported Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on MDI-X: on (auto) Supports Wake-on: pumbg Wake-on: g Current message level: 0x00000007 (7) drv probe link Link detected: yes [root@arm64v8 ~]#
4.3.1、批量網絡流量的性能測試
批量數據傳輸典型的例子有 ftp 和其它類似的網絡應用(即一次傳輸整個文件)。根據使用傳輸協議的不同,批量數據傳輸又分為 TCP 批量傳輸和 UDP 批量傳輸。
4.3.1.1、TCP_STREAM 測試
Netperf 缺省情況下進行 TCP 批量傳輸,即 -t TCP_STREAM。測試過程中 netperf 向 netserver 發送批量的 TCP 數據分組,以確定數據傳輸過程中的吞吐量。
-
測試 60 秒內 TCP 批量數據傳輸表現
[root@arm64v8 ~]# netperf -t TCP_STREAM -H 10.47.73.2 -l 60 MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 16384 60.02 925.22 [root@arm64v8 ~]#
-
- 從上面兩個示例中可以看出,當減小測試分組的大小為 4096 和增加測試分組的大小為 131072 后,吞吐量幾乎沒有變化。 由此可以說明網絡中間的路由器不存在緩沖區的問題。
4.3.1.2、UDP_STREAM 測試
用來測試進行 UDP 批量傳輸時的網絡性能。需要特別注意的是,此時測試分組的大小不得大於 socket 的發送與接收緩沖大小,否則 netperf 會報錯:
-
測試 60 秒內 UDP 批量數據傳輸表現
[root@arm64v8 ~]# netperf -t UDP_STREAM -H 10.47.73.2 -l 60 MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET Socket Message Elapsed Messages Size Size Time Okay Errors Throughput bytes bytes secs # # 10^6bits/sec 2097152 65507 60.00 111039 0 969.84 229376 60.00 66092 577.26 [root@arm64v8 ~]#
4.3.2、測試請求/應答網絡流量的性能
另一類常見的網絡流量類型是應用在 client/server 結構中的 request/response 模式。在每次交易(transaction)中,client 向 server 發出小的查詢分組,server 接收到請求,經處理后返回大的結果數據。如下圖所示:
4.3.2.1、TCP_RR 測試
TCP_RR 方式的測試對象是多次 TCP request 和 response 的交易過程,但是它們發生在同一個 TCP 連接中,這種模式常常出現在數據庫應用中。數據庫的 client 程序與 server 程序建立一個 TCP 連接以后,就在這個連接中傳送數據庫的多次交易過程。
-
測試 60 秒內 TCP_RR 數據傳輸表現
[root@arm64v8 ~]# netperf -t TCP_RR -H 10.47.73.2 -l 60 MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET : first burst 0 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 16384 131072 1 1 60.00 10203.70 16384 87380 [root@arm64v8 ~]#
-
- 從結果中可以看出,由於 request/reponse 分組的大小增加了,導致了交易率明顯的下降。
- 注:相對於實際的系統,這里交易率的計算沒有充分考慮到交易過程中的應用程序處理時延,因此結果往往會高於實際情況。
4.3.2.2、TCP_CRR 測試
與 TCP_RR 不同,TCP_CRR 為每次交易建立一個新的 TCP 連接。最典型的應用就是 HTTP,每次 HTTP 交易是在一條單獨的 TCP 連接中進行的。因此需要不停地建立新的 TCP 連接,並且在交易結束后斷開 TCP 連接,交易率一定會受到很大的影響。
-
測試 60 秒內 TCP_CRR 數據傳輸表現
[root@arm64v8 ~]# netperf -t TCP_CRR -H 10.47.73.2 -l 60 MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 16384 131072 1 1 60.00 5011.02 16384 87380 [root@arm64v8 ~]#
4.3.2.3、UDP_RR 測試
UDP_RR 方式使用 UDP 分組進行 request/response 的交易過程。由於沒有 TCP 連接所帶來的負擔,所以我們推測交易率會有一定的提升。
-
測試 60 秒內 UDP_RR 數據傳輸表現
[root@arm64v8 ~]# netperf -t UDP_RR -H 10.47.73.2 -l 60 MIGRATED UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET : first burst 0 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 2097152 2097152 1 1 60.00 20055.03 229376 229376 [root@arm64v8 ~]#
-
- 從結果中可以看出,如果發送和接收使用 1024 bytes(大包)的話會對性能產生一定影響。
A、附錄
A1、iperf 測試
iPerf 系列工具執行的是實時測量,以確定 IP 網絡上可實現的最大帶寬。它支持計時、協議以及緩存等各種參數的搭配。每次測試都會報告吞吐率、丟包率以及其它參數表現。
iPerf 常用的版本有 iPerf2 和 iPerf3。iPerf3 在 iPerf2 的基礎上新增了一些功能,例如發送方/接收方角色互換,以 JSON 格式輸出結果,零拷貝方式傳輸數據等等。也去掉了 iPerf2 中所支持少許功能,例如雙向測試,以逗號為分隔符輸出結果等。
實際上根據官方解釋,iPerf3 是一個從頭開始的新實現,其目標是創建一個更小、更簡單的代碼庫,以及一個可以在其他程序中使用的功能庫版本。注意 iPerf3 並不向后兼容 iPerf2,而且官方不再支持 iPerf2,不過有一些愛好者也在維護 iPerf2。總之更多最新信息請參考 iPerf3。
官方地址:https://software.es.net/iperf/
源碼托管地址:https://github.com/esnet/iperf
源碼下載地址:https://downloads.es.net/pub/iperf/
A2、iPerf3 安裝
[root@arm64v8 ~]# tar xf iperf-3.10.1.tar.gz [root@arm64v8 ~]# cd iperf-3.10.1/ [root@arm64v8 iperf-3.10.1]# [root@arm64v8 iperf-3.10.1]# ./configure [root@arm64v8 iperf-3.10.1]# make [root@arm64v8 iperf-3.10.1]# make install
A3、iPerf3 測試
iPerf3 中的可選參數比較多,具體可以參見其用戶手冊:https://iperf.fr/iperf-doc.php
A3.1、iPerf3 工作模式和參數
iPerf3 工作時需要指定 Server 模式或 Client 模式,通過不同的參數來區別(-s 和 -c)。iPerf3 所支持的功能也都通過設置不同的參數來實現。iPerf3 的參數分為 3 類:通用參數、Server 端參數、Client 端參數。通用參數為 Server 端和 Client 端都可以使用的參數。
通用參數:
-p, --port #: Server 端監聽、Client 端連接的端口號,默認是5201端口; -f, --farmat [k|m|g|K|M|G]: 指定帶寬輸出單位,"[k|m|g|K|M|G]"分別表示以Kbits, Mbits, Gbits, KBytes, MBytes,GBytes顯示輸出結果。 默認是Mbits。 eg:iperf3 -c 192.168.12.168 -f M -i, --interval #: 指定每次報告之間的時間間隔,單位為秒。 eg:iperf3 -c 192.168.12.168 -i 2 -F, --file name: 指定文件作為數據流進行帶寬測試。 如果使用在 Client 端,發送該文件用作測試; 如果使用在 Server 端,則是將數據寫入該文件,而不是丟棄; eg:iperf3 -c 192.168.12.168 -F web-ixdba.tar.gz -A, --affinity n/n,m: CPU親和性,可以將具體的iperf3進程綁定對應編號的邏輯CPU,避免iperf3進程在不同的CPU間調度。 -B, --bind host: 綁定指定的網卡接口; -V, --verbose: 運行時輸出更多細節; -J, --json: 運行時以 JSON 格式輸出結果; --logfile file: 輸出到文件; -d, --debug: 以 debug 模式輸出結果; -v, --version: 顯示版本信息並退出; -h, --help: 顯示幫助信息並退出。
Server 端參數:
-s, --server: 以 Server 模式運行;
-D, --daemon: 在后台以守護進程運行;
-I, --pidfile file: 指定 pid 文件;
-1, --one-off: 只接受 1 次來自 Client 端的測試,然后退出。
Client 端參數:
-c, --client: 以 Client 模式運行,並指定 Server 端的地址; -u, --udp: 表示采用UDP協議發送報文,不帶該參數表示采用TCP協議; -b, --bandwidth #[KMG][/#]: 限制測試帶寬。UDP 默認為 1Mbit/秒,TCP 默認無限制; -t, --time #: 以時間為測試結束條件進行測試,默認為 10 秒; -n, --bytes #[KMG]: 以數據傳輸大小為測試結束條件進行測試; -k, --blockcount #[KMG]: 以傳輸數據包數量為測試結束條件進行測試; -l, --len #[KMG]: 讀寫緩沖區的長度,TCP 默認為 128K,UDP 默認為 8K; --cport: 指定 Client 端運行所使用的 TCP 或 UDP 端口,默認為臨時端口; -P, --parallel #: 測試數據流並發數量; -R, --reverse: 反向模式運行(Server 端發送,Client 端接收); -w, --window #[KMG]: 設置套接字緩沖區大小,TCP 模式下為窗口大小; -C, --congestion: 設置 TCP 擁塞控制算法(僅支持 Linux 和 FreeBSD ); -M, --set-mss #: 設置 TCP/SCTP 最大分段長度(MSS,MTU 減 40 字節); -N, --no-delay: 設置 TCP/SCTP no delay,屏蔽 Nagle 算法; -4, --version4: 僅使用 IPv4; -6, --version6: 僅使用 IPv6; -S, --tos N: 設置 IP 服務類型(TOS,Type Of Service); -L, --flowlabel N: 設置 IPv6 流標簽(僅支持 Linux); -Z, --zerocopy: 使用 “zero copy”(零拷貝)方法發送數據; -O, --omit N: 忽略前 n 秒的測試; -T, --title str: 設置每行測試結果的前綴; --get-server-output: 從 Server 端獲取測試結果; --udp-counters-64bit: 在 UDP 測試包中使用 64 位計數器(防止計數器溢出)。
iPerf3 功能十分強大,支持的參數特別多。但是在實際使用中,並不需要同時使用這么多參數。使用時,根據實際需求來設置關鍵參數就可以了。
注意:iPerf3 版本迭代比較快,每個版本的參數多多少少有一些區別,不過針對整體使用沒有任何障礙,如果設置參數時,有一些問題,查看 man iperf3 即可解決。
A3.2、iPerf3 用例
A3.2.1、環境准備
Server 端 IP 地址:10.47.73.2
Client 端 IP 地址:10.47.73.11
A3.2.2、測試 TCP 吞吐量
-
Server 端開啟 iperf3 的服務器模式,指定 TCP 端口:
[root@brinnatt ~]# iperf3 -s -i 10 -p 478 ----------------------------------------------------------- Server listening on 478 (test #1) -----------------------------------------------------------
A3.2.3、測試 UDP 吞吐量
帶寬測試通常采用 UDP 模式,因為能測出極限帶寬、時延抖動、丟包率。
在進行測試時,首先以鏈路理論帶寬作為數據發送速率進行測試。例如,從客戶端到服務器之間的鏈路的理論帶寬為 1000Mbps,先用 -b 1000M 進行測試,得到測試結果(包括實際帶寬,時延抖動和丟包率)。再以實際帶寬(假如 956 Mbits/sec)作為數據發送速率進行測試,會發現時延抖動和丟包率比第一次好很多,重復測試幾次,就能得出穩定的實際帶寬。
-
Server 端開啟 iperf3 的服務器模式
[root@brinnatt ~]# iperf3 -s -i 10 -p 478
- Jitter 為抖動,在連續傳輸中的平滑平均值差。
- Lost 為丟包數量。
- Total Datagrams 為傳輸總包數量。
再以 956 Mbits/sec 進行測試,如下:
[root@arm64v8 ~]# iperf3 -u -c 10.47.73.2 -b 956M -t 60 -p 478 ...... [ 5] 58.00-59.00 sec 114 MBytes 956 Mbits/sec 82537 [ 5] 59.00-60.00 sec 114 MBytes 956 Mbits/sec 82503 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams [ 5] 0.00-60.00 sec 6.68 GBytes 956 Mbits/sec 0.000 ms 0/4951591 (0%) sender [ 5] 0.00-60.00 sec 6.68 GBytes 956 Mbits/sec 0.016 ms 0/4951575 (0%) receiver iperf Done.
A4、生產測試
A4.1、硬件環境
配置 | x86 | arm64-single | arm64-double |
---|---|---|---|
CPU | X86(Gold 6138) | arm64-64core | arm64-128core |
MEM | 256G | 256G | 256G |
SYS | Centos8.4 | Centos8.4 | Centos8.4 |
NET CARD | Intel Corporation I350 Gigabit | Intel Corporation I350 Gigabit | Intel Corporation I350 Gigabit |
A4.2、測試結果
協議 | X86(Gold 6138) | arm64-64core | arm64-128core |
---|---|---|---|
tcp 傳輸速率 | 994 Mbits/sec | 995 Mbits/sec | 992 Mbits/sec |
udp 傳輸速率 | 948 Mbits/sec | 944 Mbits/sec | 956 Mbits/sec |
-
查看 netserver 命令幫助:
[root@brinnatt ~]# netserver -h Usage: netserver [options] Options: -h Display this text -D Do not daemonize -d Increase debugging output -f Do not spawn chilren for each test, run serially -L name,family Use name to pick listen address and family for family -N No debugging output, even if netperf asks -p portnum Listen for connect requests on portnum. -4 Do IPv4 -6 Do IPv6 -v verbosity Specify the verbosity level -V Display version information and exit -Z passphrase Expect passphrase as the first thing received [root@brinnatt ~]#
-
- 從 netperf 的結果輸出中,我們可以知道以下的一些信息:
- 遠端系統(即 server)使用大小為 87380 字節的 socket 接收緩沖;
- 本地系統(即 client)使用大小為 16384 字節的 socket 發送緩沖;
- 向遠端系統發送的測試分組大小為 16384 字節;
- 測試的時間為 60 秒。
- 吞吐量的測試結果為 925.22 Mbits/秒。
- 在缺省情況下,netperf 向 netserver 發送的測試分組大小為本地系統所使用的 socket 發送緩沖大小,測試時間為 10 秒。
- 如果懷疑路由器由於缺乏足夠的緩沖區空間,使得轉發大的分組時存在問題,就可以增加測試分組(-m)的大小,以觀察吞吐量的變化。
- 然后減小測試分組的大小,如果吞吐量有了較大的提升,則說明在網絡中間的路由器確實存在緩沖區的問題。
- 從 netperf 的結果輸出中,我們可以知道以下的一些信息:
-
測試分組為 4096,觀察吞吐量的變化
[root@arm64v8 ~]# netperf -t TCP_STREAM -H 10.47.73.2 -l 60 -- -m 131072 MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 131072 60.03 925.22 [root@arm64v8 ~]# netperf -t TCP_STREAM -H 10.47.73.2 -l 60 -- -m 4096 MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 4096 60.02 925.21
-
- 測試結果說明:接收的 66092 少於發送的 111039,吞吐量也有差別
- UDP_STREAM 方式的結果中有兩行測試數據:
- 第一行顯示的是本地系統的發送統計,這里的吞吐量表示 netperf 向本地 socket 發送分組的能力,但是我們知道 UDP 是不可靠的傳輸協議,發送出去的分組數量不一定等於接收到的分組數量。
- 第二行顯示的就是遠端系統接收的情況,由於 client 與 server 通過交換機連接,遠端系統的 socket 緩沖大小不同於本地系統的 socket 緩沖區大小,而且由於 UDP 協議的不可靠性,遠端系統的接收吞吐量要遠遠小於發送出去的吞吐量。
-
不用大於系統默認的 socket 緩存,大於協調值 65507 一點點都報錯,如下
[root@arm64v8 ~]# netperf -t UDP_STREAM -H 10.47.73.2 -l 60 MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET Socket Message Elapsed Messages Size Size Time Okay Errors Throughput bytes bytes secs # # 10^6bits/sec 2097152 65507 60.00 124664 0 1088.85 229376 60.00 77182 674.13 [root@arm64v8 ~]# netperf -t UDP_STREAM -H 10.47.73.2 -l 60 -- -m 65508 MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET send_data: data send error: Message too long (errno 90) netperf: send_omni: send_data failed: Message too long [root@arm64v8 ~]#
-
- 從 netperf 的結果輸出中可以看出:第一行顯示本地系統的情況,第二行顯示的是遠端系統的信息,平均的交易率(transaction rate)為 10203.70 次/秒。
- 注意默認情況下每次交易中的 request 和 response 分組的大小都為 1 個字節,不具有實際意義。
-
通過使用 -r 參數測試
[root@arm64v8 ~]# netperf -t TCP_RR -H 10.47.73.2 -l 60 -- -r 128,8192 MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET : first burst 0 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 16384 131072 128 8192 60.00 4454.73 16384 87380 [root@arm64v8 ~]#
-
- 從結果中可以看出,每次重新建立 TCP 連接,效率明顯下降。即使是使用 1 個字節的 request/response 分組,交易率也明顯的降低了,只有 5011.02 次/秒。
-
通過使用 -r 參數測試
[root@arm64v8 ~]# netperf -t TCP_CRR -H 10.47.73.2 -l 60 -- -r 32,64 MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 16384 131072 32 64 60.00 4978.18 16384 87380 [root@arm64v8 ~]#
-
- 交易率為 20055.03,高過 TCP_RR 的數值,也符合預期。如果出現了相反的結果,即交易率反而降低了,也不需要擔心,因為這說明了在網絡中,路由器或其它的網絡設備對 UDP 采用了與 TCP 不同的緩沖區空間和處理技術。
-
通過使用 -r 參數測試
[root@arm64v8 ~]# netperf -t UDP_RR -H 10.47.73.2 -l 60 -- -r 1024,1024 MIGRATED UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.47.73.2 () port 0 AF_INET : first burst 0 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 2097152 2097152 1024 1024 60.00 11076.18 229376 229376 [root@arm64v8 ~]#
-
Client 端啟動 iperf3 的客戶端模式,連接服務端:
[root@arm64v8 ~]# iperf3 -c 10.47.73.2 -i 10 -t 60 -p 478 Connecting to host 10.47.73.2, port 478 [ 5] local 10.47.73.11 port 55976 connected to 10.47.73.2 port 478 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-10.00 sec 1.10 GBytes 943 Mbits/sec 0 380 KBytes [ 5] 10.00-20.00 sec 1.10 GBytes 942 Mbits/sec 0 437 KBytes [ 5] 20.00-30.00 sec 1.10 GBytes 941 Mbits/sec 0 437 KBytes [ 5] 30.00-40.00 sec 1.10 GBytes 941 Mbits/sec 0 437 KBytes [ 5] 40.00-50.00 sec 1007 MBytes 844 Mbits/sec 2 667 KBytes [ 5] 50.00-60.00 sec 1.10 GBytes 942 Mbits/sec 0 667 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.00 sec 6.47 GBytes 926 Mbits/sec 2 sender [ 5] 0.00-60.00 sec 6.46 GBytes 925 Mbits/sec receiver iperf Done. [root@arm64v8 ~]#
-
- Interval 表示時間間隔。
- Transfer 表示時間間隔里面傳輸的數據量。
- Bitrate 表示時間間隔里的傳輸速率。
- Retr 表示重傳次數
- Cwnd 表示窗口大小
-
測試多線程 TCP 吞吐量,以太網屬於爭用機制,多線程測試具有一定實際意義:
[root@arm64v8 ~]# iperf3 -c 10.47.73.2 -i 10 -t 60 -p 478 -P 30
-
進行上下行帶寬測試(雙向傳輸)
[root@arm64v8 ~]# iperf3 -c 10.47.73.2 -i 10 -t 60 -p 478 -P 30 -d
-
Client 端啟動 iperf3 的客戶端模式,連接服務端
[root@arm64v8 ~]# iperf3 -u -c 10.47.73.2 -b 1000M -t 60 -p 478 ...... [ 5] 58.00-59.00 sec 114 MBytes 958 Mbits/sec 82723 [ 5] 59.00-60.00 sec 114 MBytes 958 Mbits/sec 82717 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams [ 5] 0.00-60.00 sec 6.69 GBytes 958 Mbits/sec 0.000 ms 0/4960529 (0%) sender [ 5] 0.00-60.00 sec 6.68 GBytes 956 Mbits/sec 0.016 ms 6244/4960077 (0.13%) receiver iperf Done.
-
- 通過跟上面對比,丟包率變成了 0,更接近真實帶寬。
-
測試多線程 UDP 吞吐量
[root@arm64v8 ~]# iperf3 -u -c 10.47.73.2 -b 956M -t 60 -p 478 -P 30
-
- 如果沒有指定發送方式,iPerf3 客戶端只會使用單線程。
- 多線程得到的結果丟包率比較嚴重。
-
進行上下行帶寬測試(雙向傳輸)
[root@arm64v8 ~]# iperf3 -u -c 10.47.73.2 -b 956M -t 60 -p 478 -P 30 -d