全部產品
Search
文件中心

Elastic Compute Service:網路效能測試方法

更新時間:Oct 15, 2024

網路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萬

  1. 分別遠端連線測試機和輔助測試機。

  2. 分別在測試機和輔助測試機上執行以下命令,下載Netperf。

    wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
  3. 分別在測試機和輔助測試機上執行以下命令,安裝Netperf和sar監控工具。

    1. 執行以下命令,解壓Netperf包。

      sudo yum install -y gcc autoconf automake libtool sysstat
      tar -zxvf netperf-2.7.0.tar.gz
    2. 執行以下命令,查詢gcc版本號碼。

      gcc -v 2>&1
    3. 若測試機和輔助測試機安裝的gcc版本高於10版本,則您需要繼續執行下述操作,以確保gcc可以正常編譯。否則,請忽略此步驟。

      1. 執行以下命令,修改nettest_omni.c檔案。

        cd netperf
        vim src/nettest_omni.c
      2. 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    */
      3. 修改完成後按Esc鍵,輸入:wq後按下斷行符號鍵,儲存並退出。

    4. 執行以下命令,安裝Netperf和sar監控工具。

      cd netperf
      sudo ./configure
      sudo make && sudo make install
  4. 在測試機上執行以下命令,啟動64個netserver服務。

    #!/bin/bash
    for j in `seq 64`; do
        netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1  &
    done
  5. 在測試機上執行以下命令,查詢測試機的私網IP地址。

    ifconfig || ip addr

    image.png

  6. 在輔助測試機上執行以下命令,向測試機輸入資料流量。

    #!/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地址,樣本如下圖所示。

    image.png

  7. 在測試機上執行以下命令,測試網路PPS。

    sar -n DEV 1

    在測試結果中查看rxpck/s列的資料值,rxpck/s表示該測試機每秒鐘接收的資料包總數。如下圖所示,樣本中測試機每秒鐘接收到的資料包平均數約為94萬。

    image.png

網路PPS大於600萬小於2000萬

  1. 分別遠端連線測試機和輔助測試機。

  2. 分別在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
  3. 在測試機上執行以下命令,查詢測試機的私網IP地址。

    ifconfig || ip addr

    image.png

  4. 分別在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是輸入資料流量的時間,請您根據實際情況修改。

  5. 分別在3台輔助測試機和1台測試機上執行以下命令,測試網路流量。

    sar -n DEV 1

    在測試機上查看rxpck/s列的資料值,rxpck/s表示該測試機每秒鐘接收到的資料包。如下圖所示,樣本中測試機每秒鐘接收到的資料包數約為1200萬。接收資料包

網路PPS大於2000萬

  1. 分別遠端連線測試機和輔助測試機。

  2. 分別在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
  3. 在測試機上執行以下命令,綁定中斷。

    在高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
  4. 在測試機上執行以下命令,查詢測試機的私網IP地址。

    ifconfig || ip addr

    image.png

  5. 分別在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是輸入資料流量的時間,請您根據實際情況修改。

  6. 分別在3台輔助測試機和1台測試機上執行以下命令,測試網路流量。

    sar -n DEV 1

    在測試機上查看rxpck/s列的資料值,rxpck/s表示該測試機每秒鐘接收到的資料包。如下圖所示,樣本中測試機每秒鐘接收到的資料包數約為2000萬。2400萬PPS

測試網路頻寬

Linux執行個體

  1. 分別遠端連線測試機和輔助測試機。

  2. 分別在測試機和輔助測試機上執行以下命令,下載Netperf。

    wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
  3. 分別在測試機和輔助測試機上執行以下命令,安裝Netperf和sar監控工具。

    1. 執行以下命令,解壓Netperf包。

      sudo yum install -y gcc autoconf automake libtool sysstat
      tar -zxvf netperf-2.7.0.tar.gz
    2. 執行以下命令,查詢gcc版本號碼。

      gcc -v 2>&1
    3. 若測試機和輔助測試機安裝的gcc版本高於10版本,則您需要繼續執行下述操作,以確保gcc可以正常編譯。否則,請忽略此步驟。

      1. 執行以下命令,修改nettest_omni.c檔案。

        cd netperf
        vim src/nettest_omni.c
      2. 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    */
      3. 修改完成後按Esc鍵,輸入:wq後按下斷行符號鍵,儲存並退出。

    4. 執行以下命令,安裝Netperf和sar監控工具。

      cd netperf
      sudo ./configure
      sudo make && sudo make install
  4. 在測試機上執行以下命令,啟動64個netserver服務。

    #!/bin/bash
    for j in `seq 64`; do
        netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1  &
    done
  5. 在測試機上執行以下命令,查詢測試機的私網IP地址。

    ifconfig || ip addr

    image.png

  6. 在輔助測試機上執行以下命令,向測試機輸入資料流量。

    #!/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地址,樣本如下圖所示。

    image.png

  7. 在測試機上執行以下命令,測試網路頻寬。

    sar -n DEV 1

    在測試結果中查看rxkB/s列的資料值,rxkB/s表示該測試機每秒鐘接收的資料包的大小,單位為KB(KB)。與頻寬(kbps)轉換關係為:頻寬(kbps)= KB數(rxkB/s)* 8。

    樣本如下圖所示。image.png

Windows執行個體

  1. 分別遠端連線測試機和輔助測試機。

    具體操作,請參見通過密碼或密鑰認證登入Windows執行個體

  2. 分別在測試機和輔助測試機中安裝測試載入器並關閉防火牆。

    1. 下載ntttcp.exe工具,並擷取存放路徑。

    2. 開啟運行對話方塊,輸入powershell進入PowerShell命令列。

    3. 運行以下命令,關閉防火牆,避免防火牆可能阻止兩台機器的串連。

      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實際路徑>

  3. 在測試機中運行以下命令,設定網卡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配置通常需要重啟網卡服務,可能會導致當前通過該網卡的網路連接暫時中斷,請您在串連恢複後再進行後續操作。

  4. 在測試機中執行以下命令,準備接收資料。

    $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實際路徑>

  5. 在輔助測試機中執行以下命令,發送資料。

    $serverIp = "<測試機私網IP地址>"
    $threadNum = "<測試機threadNum>"
    <輔助測試機ntttcp.exe實際路徑> -s -m $threadNum,*,$serverIp -t 100
    說明

    您需要根據環境替換<測試機私網IP地址>(可通過ipconfig命令擷取)、<測試機threadNum>(可通過$cpuNum命令擷取)和<輔助測試機ntttcp.exe實際路徑>

  6. 在測試機中查看測試的網路頻寬。

    測試樣本如下圖所示,Throughput(MB/s)值表示網路頻寬(資料轉送速度)。

    image

測試網路時延

Linux執行個體

  1. 分別遠端連線測試機和輔助測試機。

  2. 分別在測試機和輔助測試機上執行以下命令,安裝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
  3. 在測試機上執行以下命令,查詢測試機的私網IP地址。

    ifconfig || ip addr

    image.png

  4. 在測試機上執行以下命令,啟動服務。

    sockperf sr --tcp --daemonize
  5. 在輔助測試機上執行以下命令,向測試機輸入資料流量。

    sockperf pp -i <測試機私網IP地址> --tcp -t 30 -m 14 --full-log=result.json

    <測試機私網IP地址>需替換為上一步查詢的實際測試機的私網IP地址。

  6. 在測試機中查看測試的網路時延。

    測試樣本如下圖所示:

    • avg-latency開頭的結果資料表示平均時延,單位為us。

    • percentile 99.000開頭的結果資料表示99分位時延,單位為μs。

    image.png

Windows執行個體

  1. 分別遠端連線測試機和輔助測試機。

    具體操作,請參見通過密碼或密鑰認證登入Windows執行個體

  2. 分別在測試機和輔助測試機中安裝測試載入器並關閉防火牆。

    1. 下載latte.exe工具,並擷取存放路徑。

    2. 開啟運行對話方塊,輸入powershell進入PowerShell命令列。

    3. 運行以下命令,關閉防火牆,避免防火牆可能阻止兩台機器的串連。

      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實際路徑>

  3. 在測試機中執行以下命令,準備接收資料。

    $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實際路徑>

    • <通訊連接埠>由您自訂,但是必須確保測試機和輔助測試機兩端的連接埠號碼一致。

  4. 在輔助測試機中執行以下命令,發送資料。

    $serverIp = "<測試機私網IP地址>"
    $port = <通訊連接埠>
    & "<輔助測試機latte.exe實際路徑>" -c -a "${serverIp}:$port" -i 65535
    說明
    • 您需要根據環境替換<測試機私網IP地址>(可通過ipconfig命令擷取)、<輔助測試機latte.exe實際路徑>

    • <通訊連接埠>由您自訂,但是必須確保測試機和輔助測試機兩端的連接埠號碼一致。

  5. 在測試機中查看測試的網路時延。

    測試樣本如下圖所示,Latency(usec)值表示資料轉送的平均時延,單位為us。

    image