網絡PPS(每秒傳輸數據包數)、網絡帶寬(數據傳輸速度)和網絡時延(數據從發送端發出到接收端接收到所需的時間)是衡量云服務器網絡性能的重要指標,測試網絡性能可以幫助您評估網絡的穩定性、延遲和吞吐量,從而為您提供更好的用戶體驗和應用程序性能。本文為您介紹如何使用Netperf、sockperf等工具測試ECS實例的網絡PPS、網絡帶寬和網絡時延,您可以根據測試結果評估ECS實例的網絡性能。
強烈建議您在新購買的無數據的ECS實例上使用工具測試網絡性能,避免造成數據丟失。
實例規格指標均在測試數據環境下驗證獲得。在真實場景中,受實例負載、組網模型等其他因素的影響,實例的性能表現可能存在差異,請您以實際情況為準。
準備測試環境
環境要求
準備測試網絡PPS、帶寬和時延等不同測試場景的ECS實例。創建實例的操作,請參見自定義購買實例。
重要在測試網絡性能時,強烈建議您使用相同規格的實例來確保測試結果的準確性和可比性,避免不同實例規格的vCPU核數、內存大小、網絡帶寬等其他因素對測試結果產生影響。
在同一測試場景下,所有ECS實例必須屬于同一個VPC、同一臺交換機和同一個安全組。
環境示例
本文測試網絡性能使用的測試機(ECS實例)和輔助測試機(ECS實例)的實例規格及數量如下所示。在實際測試過程中,請您根據實際環境選擇兩臺機器進行測試。
測試ECS實例的網絡PPS(僅適用于Linux)
說明由于目前Windows沒有較好的網絡PPS測試工具,所以暫不提供Windows的網絡PPS測試方法。
網絡PPS小于600萬
測試示例
測試機
輔助測試機
實例規格
ecs.g7.large
ecs.g7.large
鏡像
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
實例數量
1臺
1臺
網絡
分配公網IP地址
網絡PPS大于600萬小于2000萬
測試示例
測試機
輔助測試機
實例規格
ecs.g7.16xlarge
ecs.g7.16xlarge
鏡像
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
實例數量
1臺
3臺
網絡
分配公網IP地址
網絡PPS大于2000萬
測試示例
測試機
輔助測試機
實例規格
ecs.g7.32xlarge
ecs.g7.32xlarge
鏡像
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
實例數量
1臺
3臺
網絡
分配公網IP地址
測試ECS實例的網絡帶寬和網絡時延
Linux實例
測試示例
測試機
輔助測試機
實例規格
ecs.g7.large
ecs.g7.large
鏡像
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
實例數量
1臺
1臺
網絡
分配公網IP地址
Windows實例
測試示例
測試機
輔助測試機
實例規格
ecs.g7.large
ecs.g7.large
鏡像
Windows Server 2022
Windows Server 2022
實例數量
1臺
1臺
網絡
分配公網IP地址
測試網絡性能
測試網絡PPS(僅適用于Linux)
由于目前Windows沒有較好的PPS測試工具,所以暫不提供Windows的網絡PPS測試方法。
網絡PPS小于600萬
分別遠程連接測試機和輔助測試機。
具體操作,請參見通過密碼或密鑰認證登錄Linux實例。
分別在測試機和輔助測試機上執行以下命令,下載Netperf。
wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
分別在測試機和輔助測試機上執行以下命令,安裝Netperf和sar監控工具。
執行以下命令,解壓Netperf包。
sudo yum install -y gcc autoconf automake libtool sysstat tar -zxvf netperf-2.7.0.tar.gz
執行以下命令,查詢
gcc
版本號。gcc -v 2>&1
若測試機和輔助測試機安裝的
gcc
版本高于10版本,則您需要繼續執行下述操作,以確保gcc
可以正常編譯。否則,請忽略此步驟。執行以下命令,修改
nettest_omni.c
文件。cd netperf vim src/nettest_omni.c
按i鍵進入編輯模式,手動刪除
nettest_omni.c
文件中的聲明變量內容。聲明變量內容如下所示:
/* different options for the sockets */ int loc_nodelay, /* don't/do use NODELAY locally */ rem_nodelay, /* don't/do use NODELAY remotely */ loc_sndavoid, /* avoid send copies locally */ loc_rcvavoid, /* avoid recv copies locally */ rem_sndavoid, /* avoid send copies remotely */ rem_rcvavoid; /* avoid recv_copies remotely */
修改完成后按Esc鍵,輸入
:wq
后按下回車鍵,保存并退出。
執行以下命令,安裝Netperf和sar監控工具。
cd netperf sudo ./configure sudo make && sudo make install
在測試機上執行以下命令,啟動64個netserver服務。
#!/bin/bash for j in `seq 64`; do netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1 & done
在測試機上執行以下命令,查詢測試機的私網IP地址。
ifconfig || ip addr
在輔助測試機上執行以下命令,向測試機輸入流量。
#!/bin/bash server_ip=<測試機私網IP地址> for j in `seq 64`; do port=$[16000+j] netperf -H ${server_ip} -l ${run_time:-300} -t UDP_STREAM -p $port -- -m 1 -D > /dev/null 2>&1 & done
<測試機私網IP地址>
需替換為上一步查詢的實際測試機的私網IP地址,示例如下圖所示。在測試機上執行以下命令,測試網絡PPS。
sar -n DEV 1
在測試結果中查看
rxpck/s
列的數據值,rxpck/s
表示該測試機每秒鐘接收的數據包總數。如下圖所示,示例中測試機每秒鐘接收到的數據包平均數約為94萬。
網絡PPS大于600萬小于2000萬
分別遠程連接測試機和輔助測試機。
具體操作,請參見通過密碼或密鑰認證登錄Linux實例。
分別在3臺輔助測試機和1臺測試機上執行以下命令,安裝sockperf。
sudo yum install -y autoconf automake libtool gcc-c++ cd /opt sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz sudo tar -zxf 3.8.tar.gz cd sockperf-3.8/ sudo ./autogen.sh sudo ./configure sudo make -j `cat /proc/cpuinfo| grep process | wc -l` sudo make install
在測試機上執行以下命令,查詢測試機的私網IP地址。
ifconfig || ip addr
分別在3臺輔助測試機上執行以下命令,向測試機輸入流量。
server_ip="<測試機私網IP地址>" threads=64 msg_size=14 run_time=60 basePort=6666 for((i=0;i<$threads;++i));do nohup sockperf tp -i $server_ip --pps max -m ${msg_size} -t ${run_time} --port $[${basePort}+${i}] 2>&1 & done
其中
<測試機私網IP地址>
是實際測試機的私網IP地址,run_time
是輸入流量的時間,請您根據實際情況修改。分別在3臺輔助測試機和1臺測試機上執行以下命令,測試網絡流量。
sar -n DEV 1
在測試機上查看
rxpck/s
列的數據值,rxpck/s
表示該測試機每秒鐘接收到的數據包。如下圖所示,示例中測試機每秒鐘接收到的數據包數約為1200萬。
網絡PPS大于2000萬
分別遠程連接測試機和輔助測試機。
具體操作,請參見通過密碼或密鑰認證登錄Linux實例。
分別在3臺輔助測試機和1臺測試機上執行以下命令,安裝sockperf。
sudo yum install -y autoconf automake libtool gcc-c++ cd /opt sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz sudo tar -zxf 3.8.tar.gz cd sockperf-3.8/ sudo ./autogen.sh sudo ./configure sudo make -j `cat /proc/cpuinfo| grep process | wc -l` sudo make install
在測試機上執行以下命令,綁定中斷。
在高PPS場景下,通過將中斷綁定到特定的CPU核心,可以確保處理中斷的CPU核心相對固定,減少上下文切換,提高處理效率。
a=$(cat /proc/interrupts | grep virtio2-input | awk -F ':' '{print $1}') cpu=0 for irq in $a; do echo $cpu >/proc/irq/$irq/smp_affinity_list let cpu+=2 done
在測試機上執行以下命令,查詢測試機的私網IP地址。
ifconfig || ip addr
分別在3臺輔助測試機上執行以下命令,向測試機輸入流量。
server_ip="<測試機私網IP地址>" threads=64 msg_size=14 run_time=60 basePort=6666 for((i=0;i<$threads;++i));do nohup sockperf tp -i $server_ip --pps max -m ${msg_size} -t ${run_time} --port $[${basePort}+${i}] 2>&1 & done
其中
<測試機私網IP地址>
是實際測試機的私網IP地址,run_time
是輸入流量的時間,請您根據實際情況修改。分別在3臺輔助測試機和1臺測試機上執行以下命令,測試網絡流量。
sar -n DEV 1
在測試機上查看
rxpck/s
列的數據值,rxpck/s
表示該測試機每秒鐘接收到的數據包。如下圖所示,示例中測試機每秒鐘接收到的數據包數約為2000萬。
測試網絡帶寬
Linux實例
分別遠程連接測試機和輔助測試機。
具體操作,請參見通過密碼或密鑰認證登錄Linux實例。
分別在測試機和輔助測試機上執行以下命令,下載Netperf。
wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
分別在測試機和輔助測試機上執行以下命令,安裝Netperf和sar監控工具。
執行以下命令,解壓Netperf包。
sudo yum install -y gcc autoconf automake libtool sysstat tar -zxvf netperf-2.7.0.tar.gz
執行以下命令,查詢
gcc
版本號。gcc -v 2>&1
若測試機和輔助測試機安裝的
gcc
版本高于10版本,則您需要繼續執行下述操作,以確保gcc
可以正常編譯。否則,請忽略此步驟。執行以下命令,修改
nettest_omni.c
文件。cd netperf vim src/nettest_omni.c
按i鍵進入編輯模式,手動刪除
nettest_omni.c
文件中的聲明變量內容。聲明變量內容如下所示:
/* different options for the sockets */ int loc_nodelay, /* don't/do use NODELAY locally */ rem_nodelay, /* don't/do use NODELAY remotely */ loc_sndavoid, /* avoid send copies locally */ loc_rcvavoid, /* avoid recv copies locally */ rem_sndavoid, /* avoid send copies remotely */ rem_rcvavoid; /* avoid recv_copies remotely */
修改完成后按Esc鍵,輸入
:wq
后按下回車鍵,保存并退出。
執行以下命令,安裝Netperf和sar監控工具。
cd netperf sudo ./configure sudo make && sudo make install
在測試機上執行以下命令,啟動64個netserver服務。
#!/bin/bash for j in `seq 64`; do netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1 & done
在測試機上執行以下命令,查詢測試機的私網IP地址。
ifconfig || ip addr
在輔助測試機上執行以下命令,向測試機輸入流量。
#!/bin/bash server_ip=<測試機私網IP地址> for j in `seq 64`; do port=$[16000+j] netperf -H ${server_ip} -l ${run_time:-300} -t TCP_STREAM -p $port -- -D > /dev/null 2>&1 & done
<測試機私網IP地址>
需替換為上一步查詢的實際測試機的私網IP地址,示例如下圖所示。在測試機上執行以下命令,測試網絡帶寬。
sar -n DEV 1
在測試結果中查看
rxkB/s
列的數據值,rxkB/s
表示該測試機每秒鐘接收的數據包的大小,單位為千字節(KB)。與帶寬(kbps)轉換關系為:帶寬(kbps)= 千字節數(rxkB/s)* 8。示例如下圖所示。
Windows實例
分別遠程連接測試機和輔助測試機。
具體操作,請參見通過密碼或密鑰認證登錄Windows實例。
分別在測試機和輔助測試機中安裝測試工具并關閉防火墻。
下載ntttcp.exe工具,并獲取存放路徑。
打開運行對話框,輸入powershell進入PowerShell命令行。
運行以下命令,關閉防火墻,避免防火墻可能阻止兩臺機器的連接。
Set-NetFirewallProfile -Profile * -Enabled:false
或者增加入方向規則以允許ntttcp.exe數據包通過防火墻。
$ntttcpPath = "<ntttcp.exe實際路徑>" New-NetFirewallRule -DisplayName ntttcp -Protocol Any -Direction Inbound -Action Allow -Enabled True -Profile Any -Program $ntttcpPath
說明您需要根據實際環境替換測試機的
<ntttcp.exe實際路徑>
。
在測試機中運行以下命令,設置網卡RSS功能。
RSS(Receive Side Scaling)網絡技術旨在通過將數據包分布到多個CPU核心上的接收隊列來提高網絡性能和效率,從而實現網絡處理的并行化。以下命令表示:
如果測試機的CPU數量不超過16,將RSS接收隊列的數量設置為與CPU數量相等,這樣可以確保每個CPU核心都有獨立的接收隊列來處理網絡流量。
如果測試機的CPU數量超過16,關閉RSS功能。因為很多網卡限制了RSS隊列的最大數量為16,如果繼續使用RSS可能導致資源分配不均或管理復雜性增加。
$cpuNum = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors if ($cpuNum -le 16) { Set-NetAdapterRss -Name <測試機網絡適配器的名稱> -NumberOfReceiveQueues $cpuNum } else { Disable-NetAdapterRss -Name <測試機網絡適配器的名稱> }
說明您需要根據環境替換
<測試機網絡適配器的名稱>
(可通過Get-NetAdapter | Select-Object Name
命令獲取)。修改網卡的RSS配置通常需要重啟網卡服務,可能會導致當前通過該網卡的網絡連接暫時中斷,請您在連接恢復后再進行后續操作。
在測試機中執行以下命令,準備接收數據。
$serverIp = (Get-NetIPConfiguration -InterfaceAlias <測試機網絡適配器的名稱>).IPv4Address.IPAddress $cpuNum = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors $threadNum = $cpuNum & <測試機ntttcp.exe實際路徑> -r -m $threadNum,*,$serverIp -t 300
說明您需要根據環境替換
<測試機網絡適配器的名稱>
和<測試機ntttcp.exe實際路徑>
。在輔助測試機中執行以下命令,發送數據。
$serverIp = "<測試機私網IP地址>" $threadNum = "<測試機threadNum>" <輔助測試機ntttcp.exe實際路徑> -s -m $threadNum,*,$serverIp -t 100
說明您需要根據環境替換
<測試機私網IP地址>
(可通過ipconfig
命令獲取)、<測試機threadNum>
(可通過$cpuNum
命令獲取)和<輔助測試機ntttcp.exe實際路徑>
。在測試機中查看測試的網絡帶寬。
測試示例如下圖所示,
Throughput(MB/s)
值表示網絡帶寬(數據傳輸速度)。
測試網絡時延
Linux實例
分別遠程連接測試機和輔助測試機。
具體操作,請參見通過密碼或密鑰認證登錄Linux實例。
分別在測試機和輔助測試機上執行以下命令,安裝
sockperf
。sudo yum install -y autoconf automake libtool gcc-c++ cd /opt sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz sudo tar -zxf 3.8.tar.gz cd sockperf-3.8/ sudo ./autogen.sh sudo ./configure sudo make -j `cat /proc/cpuinfo| grep process | wc -l` sudo make install
在測試機上執行以下命令,查詢測試機的私網IP地址。
ifconfig || ip addr
在測試機上執行以下命令,啟動服務。
sockperf sr --tcp --daemonize
在輔助測試機上執行以下命令,向測試機輸入流量。
sockperf pp -i <測試機私網IP地址> --tcp -t 30 -m 14 --full-log=result.json
<測試機私網IP地址>
需替換為上一步查詢的實際測試機的私網IP地址。在測試機中查看測試的網絡時延。
測試示例如下圖所示:
以
avg-latency
開頭的結果數據表示平均時延,單位為us。以
percentile 99.000
開頭的結果數據表示99分位時延,單位為μs。
Windows實例
分別遠程連接測試機和輔助測試機。
具體操作,請參見通過密碼或密鑰認證登錄Windows實例。
分別在測試機和輔助測試機中安裝測試工具并關閉防火墻。
下載latte.exe工具,并獲取存放路徑。
打開運行對話框,輸入powershell進入PowerShell命令行。
運行以下命令,關閉防火墻,避免防火墻可能阻止兩臺機器的連接。
Set-NetFirewallProfile -Profile * -Enabled:false
或者增加入方向規則以允許latte.exe數據包通過防火墻。
$lattePath = "<latte.exe實際路徑>" New-NetFirewallRule -DisplayName Latte -Protocol Any -Direction Inbound -Action Allow -Enabled True -Profile Any -Program $lattePath
說明您需要根據實際環境替換測試機的
<latte.exe實際路徑>
。
在測試機中執行以下命令,準備接收數據。
$serverIp = (Get-NetIPConfiguration | Where-Object {$_.InterfaceAlias -eq '<測試機網絡適配器的名稱>'} | Select-Object -ExpandProperty IPv4Address).IPAddress $port = <通信端口> & "<測試機latte.exe實際路徑>" -a "$serverIp`:$port" -i 65535
說明您需要根據環境替換
<測試機網絡適配器的名稱>
(可通過Get-NetAdapter | Select-Object Name
命令獲取)和<測試機latte.exe實際路徑>
。<通信端口>
由您自定義,但是必須確保測試機和輔助測試機兩端的端口號一致。
在輔助測試機中執行以下命令,發送數據。
$serverIp = "<測試機私網IP地址>" $port = <通信端口> & "<輔助測試機latte.exe實際路徑>" -c -a "${serverIp}:$port" -i 65535
說明您需要根據環境替換
<測試機私網IP地址>
(可通過ipconfig
命令獲取)、<輔助測試機latte.exe實際路徑>
。<通信端口>
由您自定義,但是必須確保測試機和輔助測試機兩端的端口號一致。
在測試機中查看測試的網絡時延。
測試示例如下圖所示,
Latency(usec)
值表示數據傳輸的平均時延,單位為us。