天翼云(yun)通(tong)用型S6、計(ji)算增強型C6 等新一代云(yun)主(zhu)(zhu)機上提(ti)(ti)供超高(gao)網(wang)絡性能(neng),您(nin)可通(tong)過本實踐提(ti)(ti)供的 netperf 和 DPDK 兩種網(wang)絡性能(neng)測試(shi)(shi)方法,進行云(yun)主(zhu)(zhu)機高(gao)吞吐網(wang)絡性能(neng)測試(shi)(shi)。
推(tui)薦(jian)選(xuan)擇 netperf 方法(fa)進行測(ce)試,netperf 為通常(chang)使用(yong)的測(ce)試方法(fa),可(ke)滿(man)足(zu)大多數測(ce)試場景。但當云主機配置較高(pps 超過1000萬且帶寬大于50Gbps)時(shi),netperf包含云主機機內核協(xie)議棧的完整處理路徑對網(wang)絡(luo)性能損耗(hao)較大,而 DPDK 可(ke)屏蔽虛(xu)擬機內核協(xie)議棧的差(cha)異(yi),獲(huo)取虛(xu)擬機網(wang)卡的網(wang)絡(luo)性能,此時(shi)可(ke)選(xuan)擇 DPDK 方法(fa)進行測(ce)試。
netperf測試
工具介紹
- Netperf
HP 開發的(de)網(wang)絡(luo)性能測(ce)量(liang)工(gong)具(ju),主要測(ce)試 TCP 及 UDP 吞吐量(liang)性能。測(ce)試結果(guo)主要反應(ying)系(xi)統向其(qi)他(ta)系(xi)統發送數(shu)(shu)據的(de)速(su)度,以及其(qi)他(ta)系(xi)統接收數(shu)(shu)據的(de)速(su)度。
- SAR
用于(yu)監控網絡流量,運行(xing)示例如下:
sar -n DEV 1
02:41:03 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
02:41:04 PM eth0 1626689.00 8.00 68308.62 1.65 0.00 0.00
0.0002:41:04 PM lo 0.00 0.00 0.00 0.00 0.00 0.00
0.0002:41:04 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
02:41:05 PM eth0 1599900.00 1.00 67183.30 0.10 0.00 0.00
0.0002:41:05 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sar -n DEV 1:該命令每秒(miao)鐘報告一次(ci)網絡設備(bei)的性能(neng)統計(ji)信(xin)息(xi)
字段解釋
| 字段 | 單位 | 說明 |
|---|---|---|
| rxpck/s | pps | 每秒收包量,即接收 pps |
| txpck/s | pps | 每秒發包量,即發送 pps |
| rxkB/s | kB/s | 接收帶寬 |
| txkB/s | kB/s | 發送帶寬 |
測試場景
| 測試場景 | 客戶端運行命令 | SAR 監控指標 |
|---|---|---|
| UDP 64 | netperf -t UDP_STREAM -H-l 10000 -- -m 64 -R 1 & | PPS |
| TCP 1500 | netperf -t TCP_STREAM -H-l 10000 -- -m 1500 -R 1 & | 帶寬 |
| TCP RR | netperf -t TCP_RR -H-l 10000 -- -r 32,128 -R 1 & | PPS |
命令說明:
- netperf: 這是 Netperf 工具的命令,用于執行網絡性能測試。
- -t UDP_STREAM/TCP_STREAM: 指定測試的類型為 UDP/TCP 流量測試。
- -H: 指定遠程主機的地址。在這里,-H 后面應該跟上遠程主機的地址或主機名。
- -l : 指定測試的時間限制,后接時間,單位為秒。
- -m : 設置消息大小,單位為字節。
- -R : 指定測試運行的數量 。
- &: 將測試命令放入后臺運行。
性能指標
| 指標 | 說明 |
|---|---|
| 64字節 UDP 收發 PPS(包/秒) | 表示通過 UDP 進行批量數據傳輸時的數據傳輸吞吐量, 能反映網絡極限轉發能力(可能會存在丟包)。 |
| 1500字節 TCP 收發帶寬(Mbits/秒) | 表示通過 TCP 進行批量數據傳輸時的數據傳輸吞吐量, 能反映網絡極限帶寬能力(可能會存在丟包)。 |
| TCP-RR(次/秒) | 表示在 TCP 長鏈接中反復進行 Request/Response 操作的交易吞吐量, 能反映 TCP 不丟包網絡轉發能力。 |
操作步驟
準備測試環境
- 準備3臺測試機器,請參見創建彈性云主機購買測試機器。本文測試機器使用 CentOS 8.2 操作系統。
- 依次登錄測試機器,并執行以下命令安裝 netperf 工具。
yum install -y sysstat wget tar automake make gccwget -O netperf-2.7.0.tar.gz -c //codeload.github.com/HewlettPackard/netperf/tar.gz/netperf-2.7.0tar zxf netperf-2.7.0.tar.gzcd netperf-netperf-2.7.0./autogen.sh && ./configure && make && make install
測試發包性能
- 分別在機器中執行命令“
pkill netserver && pkill netperf”,停止殘余的 netperf 和 netserver 進程。 - 將其中的機器 a 作為客戶端,機器 b 和機器 c 作為服務端。在服務端中執行命令“
netserver”,運行 netserver。
- 若返回結果如下圖所示,則說明仍存在其他 netserver 進程。請執行步驟1中的命令,停止該進程。

- 若返回結果如下圖所示,則說明已成功運行 netserver,請繼續下一步操作。

-
在客戶端(duan)(duan)中執行 測試場景(jing) 中提供的命令,不斷增減 netperf 進(jin)程,直到客戶端(duan)(duan)發包性能不再增加。
(1)執(zhi)行(xing)以下命令,啟(qi)動10個netperf客戶端進程
bash netperf 10 <serverip1> <serverip2> <serverip3> <serverip4> <serverip5> <serverip6> <serverip7> <serverip8> <serverip9> <serverip10>(2)同時向b、c兩臺或者多臺客戶端(duan)發送(song)數據,代碼如下
#!/bin/bash count=$1 shift while [ $# != 0 ];do for ((i=1;i<=count;i++)) do server_ip=$1 [ -z $server_ip ] && exit 0 # 下方命令可以替換為測試場景表格中的命令 # -H 后填寫服務器 IP 地址; # -l 后為測試時間,為了防止 netperf 提前結束,因此時間設為 10000; netperf -t UDP_STREAM -H $server_ip -l 10000 -- -m 64 -R 1 & echo "$server_ip run $i times" done shift done -
在客(ke)戶端(duan)執(zhi)行命令“sar -n DEV 1”,觀察客(ke)戶端(duan)發包性能變化,取最大(da)值。
根據所得結果,參考性能指標進行(xing)分析,即可測出(chu)云主機高吞(tun)吐網絡(luo)性能。
測試收包性能
- 分別在機器中執行命令“
pkill netserver && pkill netperf”,停止殘余的 netperf 和 netserver 進程。 - 將其中的機器 a 作為服務端,機器 b 和機器 c 作為客戶端。在服務端中執行命令“
netserver”,運行 netserver。
若返回結(jie)果如下圖所(suo)示(shi),則說(shuo)明仍(reng)存(cun)在其他(ta) netserver 進程。請執行(xing) 步驟(zou)1 中的(de)命(ming)令,停止(zhi)該進程。

若返(fan)回結果(guo)如下(xia)圖所示,則說明已成(cheng)功運行(xing) netserver,請繼(ji)續下(xia)一步操作。

- 在客戶端中執行 測試場景 中提供的命令,不斷增減 netperf 進程,直到客戶端發包性能不再增加。
在服務端執行命令“sar -n DEV 1”,觀察服務(wu)端(duan)收包性(xing)能變化,取最大值。
- 根據所得結果,參考 性能指標 進行分析,即可測出云主機高吞吐網絡性能。
附錄
測試輔助腳本:
執行該腳本,可快速發(fa)起(qi)多個 netperf 進程。
#!/bin/bash
count=$1
for ((i=1;i<=count;i++))
do
echo "Instance:$i-------"
# 下方命令可以替換為測試場景表格中的命令
# -H 后填寫服務器 IP 地址;
# -l 后為測試時間,為了防止 netperf 提前結束,因此時間設為 10000;
netperf -t UDP_STREAM -H <server ip> -l 10000 -- -m 64 -R 1 &
done
DPDK測試
編譯安裝 DPDK
- 準備2臺測試機器,請參見 自定義配置 Linux 云主機 購買測試機器。本文測試機器使用 CentOS 8.2 操作系統。
- 依次登錄測試機器,并執行以下命令下載 DPDK 工具。
yum install -y sysstat wget tar automake make gcc
wget //git.dpdk.org/dpdk/snapshot/dpdk-17.11.tar.gz
tar -xf dpdk-17.11.tar.gz
mv dpdk-17.11 dpdk
- 修改 txonly 引擎,使每個 DPDK 發包 CPU 上的 UDP 流量的端口變動產生多條流。
1)執行以下命令,修(xiu)改 dpdk/app/test-pmd/txonly.c 文件。
vim dpdk/app/test-pmd/txonly.c
按 i 進(jin)入編輯模式,修改以下內(nei)容:
- 找到 #include "testpmd.h",另起一行輸入如下內容:
RTE_DEFINE_PER_LCORE(struct udp_hdr, lcore_udp_hdr);
修改完成后,如下圖所示(shi):

- 找到 ol_flags |= PKT_TX_MACSEC;,另起一行輸入如下內容:
/* dummy test udp port */
static uint16_t test_port = 0;
test_port++;
memcpy(&RTE_PER_LCORE(lcore_udp_hdr), &pkt_udp_hdr, sizeof(pkt_udp_hdr));
RTE_PER_LCORE(lcore_udp_hdr).src_port = rte_cpu_to_be_16(rte_lcore_id() * 199 + test_port % 16);
RTE_PER_LCORE(lcore_udp_hdr).dst_port = rte_cpu_to_be_16(rte_lcore_id() * 1999 + test_port % 16);
修改完成后,如下圖所示:

- 找到 copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt,,將其替換為如下內容:
copy_buf_to_pkt(&RTE_PER_LCORE(lcore_udp_hdr), sizeof(RTE_PER_LCORE(lcore_udp_hdr)), pkt,
修(xiu)改完(wan)成后,如下圖所(suo)示:

按 Esc 輸入 :wq 保存修改并退出。
2)執行以下命令,修改(gai) dpdk/config/common_base 文(wen)件。
vim dpdk/config/common_base
按 i 進入編輯(ji)模式,找到 CONFIG_RTE_MAX_MEMSEG=256,將其修(xiu)改為1024。修(xiu)改完(wan)成后如下圖所(suo)示:

按 Esc 輸入 :wq 保存修改并退出。
- 執行以下命令,將 dpdk/app/test-pmd/txonly.c 的 IP 地址修改為測試機器所用 IP。
vim dpdk/app/test-pmd/txonly.c
按 i 進入編輯(ji)模(mo)式,找(zhao)到如下(xia)內容(rong):
#define IP_SRC_ADDR (198U << 24) | (18 << 16) | (0 << 8) | 1;
#define IP_DST_ADDR (198U << 24) | (18 << 16) | (0 << 8) | 2;
將數字198、18、0、1替換(huan)為機器(qi) IP,SRC_ADDR 為發送端 IP,DST_ADDR 為接收(shou)端 IP。
- 對應機器操作系統,執行以下命令,安裝 numa 庫。
yum install numactl-devel
- 在 dpdk/ 目錄下執行以下命令,關閉 KNI。
sed -i "s/\(^CONFIG_.KNI.\)=y/\1=n/g" ./config/*
7.若您的操(cao)作系統內(nei)核版本(ben)較高(例如5.3),則請執(zhi)行以(yi)下命(ming)令,屏蔽(bi)差(cha)異。
sed -i "s/\(^WERROR_FLAGS += -Wundef -Wwrite-strings$\)/\1 -Wno-address-of-packed-member/g" ./mk/toolchain/gcc/rte.vars.mksed -i "s/fall back/falls through -/g" ./lib/librte_eal/linuxapp/igb_uio/igb_uio.c
8.執(zhi)行以下命(ming)令(ling),編譯DPDK。
make defconfigmake -j
配置大頁內存
執行(xing)以下命令,配置(zhi)大(da)頁內存(cun)。
let hugepagesall=$(cat /proc/meminfo | grep MemTotal | awk '{print $2}')/1024/2048
#配置時不超過理論可配大頁個數
echo $hugepagesall > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
裝載內核模塊及綁定接口
- 切換登錄方式為使用VNC。由于將網卡驅動綁定至 igb_uio 用戶態驅動后,該網卡將無法通過 ssh 或 IP 訪問,僅支持通過 VNC 或 console 方式訪問。
- 依次執行以下命令,裝載 UIO 模塊及綁定 virito 接口。
ifconfig eth0 0
ifconfig eth0 down
modprobe uio
insmod /root/dpdk/build/kmod/igb_uio.ko
cd /root/dpdk/usertools/
python3 dpdk-devbind.py --bind=igb_uio 00:05.0
完成測試后,可通(tong)過請(qing)執行以(yi)下命(ming)令,恢復網卡(ka)變更(geng)。
cd /root/dpdk/usertools/
python3 dpdk-devbind.py --bind=virtio-pci 00:05.0
ifconfig eth0 up
測試帶寬及吞吐量
1.執行以下命令,發(fa)送端采用 TX only 模式啟(qi)動 testpmd, 接收端啟(qi)用 rxonly 模式。
- 發送端:
/root/dpdk/build/app/testpmd -- --txd=128 --rxd=128 --txq=16 --rxq=16 --nb-cores=1 --forward-mode=txonly --txpkts=1430 --stats-period=1
- 接收端:
/root/dpdk/build/app/testpmd -- --txd=128 --rxd=128 --txq=48 --rxq=48 --nb-cores=16 --forward-mode=rxonly --stats-period=1
2.執(zhi)行(xing)以下(xia)命令,測試 pps(UDP 64B 小包(bao))。
- 發送端:
/root/dpdk/build/app/testpmd -- --txd=128 --rxd=128 --txq=16 --rxq=16 --nb-cores=3 --forward-mode=txonly --txpkts=64 --stats-period=1
- 接收端:
/root/dpdk/build/app/testpmd -- --txd=128 --rxd=128 --txq=48 --rxq=48 --nb-cores=16 --forward-mode=rxonly --stats-period=1
得出如下圖所(suo)示測試結果:

網絡帶寬計算
可(ke)根據接(jie)收端 PPS 和測試包長(chang)來計算(suan)當(dang)前網絡(luo)的接(jie)收帶寬,公(gong)式如下:
PPS × packet length × 8bit/B × 10^-9 = 帶寬
結合測試(shi)得(de)出數據,可得(de)當前(qian)帶寬(kuan)為:
4692725pps × 1430B × 8bit/B × 10^-9 ≈ 53Gbps