You need to enable JavaScript to run this app.
导航
使用Pktgen测试网络性能
最近更新时间:2024.04.18 11:19:33首次发布时间:2022.03.25 07:32:09

本文介绍如何使用Pktgen测试云服务器的网络性能。

测试工具

操作步骤

说明

本文的测试结果仅作为参考,不代表云服务器的真实最优性能。

步骤一:准备环境

参考 购买云服务器,准备被测试机器(DUT)和辅助测试机器(Tester)。使用Pktgen-DPDK测试时,每台云服务器需要准备两张网卡,分别用于登录运行命令和DPDK测试使用。

本文测试环境如下表所示:

ECS云服务器
云服务器信息
数量IP地址说明

被测试机器

  • 镜像:Debian 10 64位
  • 规格:ecs.g1.16xlarge

1

192.168.222.151

被压力测试网络吞吐率的ECS实例。

辅助测试机器

  • 镜像:Debian 10 64位
  • 规格:ecs.g1.16xlarge

建议辅助测试机器的网络性能不低于被测试机器,详细规格性能请参见 实例规格介绍

1

192.168.222.240

与测试机间建立控制连接,传递测试信息及结果。

步骤二:安装软件

在被测试机器和辅助测试机器依次执行以下操作步骤,安装测试软件。

安装依赖

  1. 远程连接云服务器,详细请参见 登录实例
  2. 执行以下命令,安装依赖。
    apt update
    apt install -y libpcap-dev
    apt install -y libnuma-dev
    apt-get install python3-pip -y
    pip3 install pyelftools -i https://mirrors.ivolces.com/pypi/simple/
    pip3 install ninja -i https://mirrors.ivolces.com/pypi/simple/
    pip3 install meson -i https://mirrors.ivolces.com/pypi/simple/
    

    注意需安装Python3.6以上版本,否则会出现Python3和部分包不兼容的情况

安装测试软件

根据测试需求,参考下方操作选择对应测试工具进行安装。

Linux Pktgen

  1. 下载 pktgen脚本
  2. 确保Linux kernel中包含了pktgen module,执行modprobe pktgen命令,加载模块。

iperf

可以选择从软件源安装,或使用如下命令下载源代码进行编译。

git clone https://git.code.sf.net/p/iperf2/code iperf2-code
cd iperf2-code/
./configure
make
make install
iperf -v         # 检查编译安装结果

Pktgen-DPDK

使用Pktgen-DPDK测试时,每台实例需要准备两张网卡,分别用于登陆运行命令和DPDK测试使用。

  1. 创建build.sh脚本,下载DPDK和pktgen的源代码进行编译。

    1. 执行vim build.sh命令,创建build.sh文件。
    2. i,进入编辑模式。
    3. 在build.sh文件中,输入如下内容。
      #!/bin/bash
      
      # 使用当前目录下载源代码
      cur_dir=$(cd $(dirname $0); pwd)
      
      # 若dpdk文件夹不存在则下载
      cd $cur_dir
      if [ ! -e $cur_dir/dpdk ]
        then git clone https://dpdk.org/git/dpdk dpdk ; echo $?
      fi
      
      # 若Pktgen-DPDK文件夹不存在则下载
      cd $cur_dir
      if [ ! -e $cur_dir/Pktgen-DPDK ]
        then git clone https://github.com/pktgen/Pktgen-DPDK.git Pktgen-DPDK ; echo $?
      fi
      
      # 编译安装DPDK
      cd $cur_dir/dpdk ; git checkout v21.11 ; meson build
      cd $cur_dir/dpdk/build ; ninja ; ninja install ; ldconfig
      
      # 编译安装Pktgen-DPDK
      cd $cur_dir/Pktgen-DPDK ; git checkout pktgen-21.11.0 ;
      meson build ; ninja -C build
      
      # 检查编译结果是否生成可执行文件
      ls -l $cur_dir/Pktgen-DPDK/build/app/pktgen
      
    4. Esc退出编辑模式,然后输入:wq并回车。
    5. 执行chmod +x build.sh指令,赋予build.sh文件执行权限。
    6. 执行bash build.sh命令,运行脚本。

    说明

    若测试所用网络端口的队列数大于16,在编译前修改源代码app/pktgen-constants.h中常量NUM_Q的数值进行匹配。

  2. 执行如下命令,将DPDK动态库加入到系统配置。

    echo "/usr/local/lib/x86_64-linux-gnu/" >> /etc/ld.so.conf
    /sbin/ldconfig -v
    
    
  3. 执行ethtool -i eth1命令,获取用于DPDK测试的网卡的PCI地址。本文以DPDK测试网卡为eth1为例。
    回显信息如下:
    alt

  4. 创建bind-igbuio.sh脚本,将测试用网口绑定到igb_uio。

    1. 执行vim bind-igbuio.sh命令,创建bind-igbuio.sh文件。
    2. i,进入编辑模式。
    3. 在bind-igbuio.sh文件中,输入如下内容。
      #!/bin/bash
      
      # 指定DPDK源代码目录
      dpdk_dir=/root/dpdk/
      # 指定需要绑定igb_uio的网卡PCI地址
      nic_bdf=00:07.0
      
      # 使用当前目录下载dpdk-kmods源代码
      cur_dir=$(cd $(dirname $0); pwd)
      net_str=$(ls -l /sys/class/net/ | grep $nic_bdf)
      eth_str=${net_str##*/}
      
      # 若dpdk-kmods文件夹不存在则下载
      if [ ! -e $cur_dir/dpdk-kmods/linux/igb_uio ]
        then git clone https://dpdk.org/git/dpdk-kmods ; echo $?
      fi
      
      # 编译igb_uio.ko
      cd $cur_dir/dpdk-kmods/linux/igb_uio/ ; make ; modprobe uio ; insmod igb_uio.ko ; echo $?
      
      ifconfig $eth_str down ; echo $?
      
      # 绑定网卡到igb_uio
      cd $dpdk_dir ; ./usertools/dpdk-devbind.py --bind=igb_uio $nic_bdf ; echo $?
      
      
    4. Esc退出编辑模式,然后输入:wq并回车。
    5. 执行chmod +x bind-igbuio.sh指令,赋予bind-igbuio.sh文件执行权限。
    6. 执行bash bind-igbuio.sh命令,运行脚本。
  5. 执行如下命令,配置大页内存。本文假设实例有2个NUMA节点。

    echo 8192 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
    echo 8192 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
    cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
    cat /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
    cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/free_hugepages
    cat /sys/devices/system/node/node1/hugepages/hugepages-2048kB/free_hugepages
    
    

步骤三:性能测试

小包传输性能(pps)测试

使用Linux pktgen测试UDP pps性能

  1. 在辅助测试机器,执行如下命令进行发包。
    bash .sh -i [eth_dev] -d [dut_ip] -s 64 -m [dut_mac] -c 10 -p 40000-40003 -n 0 -t [queue_num]

    说明:

    • [eth_dev]:网卡设备名称
    • [dut_ip]:被测试机器私网IP
    • [dut_mac]:被测试机器MAC地址
    • [queue_num]:队列数

    由于脚本中有如下配置,此时产生的flow总数为:(109 - 9 + 1) * (40003 - 40000 + 1) = 101 * 4 = 404

    # Flow variation random source port between min and max
    UDP_SRC_MIN=9
    UDP_SRC_MAX=109
    
    
  2. 在被测试机器执行sar -n DEV 1,观测网络吞吐率。
    回显如下:
    alt

使用Pktgen-DPDK测试UDP pps性能

说明

使用Pktgen-DPDK测试前,需分别在被测试机器和辅助测试机器将测试使用的网卡绑定到igb_uio,并配置大页内存。详细操作请参考上方安装Pktgen-DPDK

  1. 在被测试机器和辅助测试机器分别执行如下操作,运行pktgen。
    1. 执行vim run.sh命令,创建run.sh文件。
    2. i,进入编辑模式。
    3. 在run.sh文件中,输入如下内容。
      #!/bin/bash
      
      pktgen_dir=/root/Pktgen-DPDK/          # 修改为您服务器上已经编译的Pktgen-DPDK源代码目录
      nic_bdf=00:07.0                        # 修改为您服务器上已经绑定igb_uio的网卡PCI地址
      
      $pktgen_dir/build/app/pktgen -c 0xffff1 -n 4 -a $nic_bdf -- -P -m "[1-32:1-32].0"
      
      

      说明:

      • 0xffff1:表示进程使用的CPU掩码,其中最低BIT CPU用于shell控制,其他CPU可以用于端口收发包。
      • [1-32:1-32].0:表示CPU编号,该CPU编号不能超出掩码中用于收发包的CPU范围。
        • 1-32(冒号前):用于收包
        • 1-32(冒号后):用于发包
        • .0:表示端口为0
    4. Esc退出编辑模式,然后输入:wq并回车。
    5. 执行chmod +x run.sh指令,赋予run.sh文件执行权限。
    6. 执行bash run.sh命令,运行脚本。
  2. 在辅助测试机器的pktgen中执行以下命令,启动发包。
    set 0 proto udp
    range 0 src mac start 00:16:3e:2c:3b:5d        #辅助测试机器网络设备MAC地址
    range 0 src mac min 00:16:3e:2c:3b:5d          #辅助测试机器网络设备MAC地址
    range 0 src mac inc 00:00:00:00:00:00
    range 0 dst mac start 00:16:3e:37:78:b8        #被测试机器网络设备MAC地址
    range 0 dst mac min 00:16:3e:37:78:b8          #被测试机器网络设备MAC地址
    range 0 dst mac inc 00:00:00:00:00:00
    range 0 src port start 10000       
    range 0 src port min 10000         
    range 0 src port max 10000         
    range 0 src port inc 0
    range 0 dst port start 2000
    range 0 dst port min 2000
    range 0 dst port max 2255
    range 0 dst port inc 1
    range 0 proto udp
    range 0 src ip start 192.168.222.240            #辅助测试机器私网IP
    range 0 src ip min 192.168.222.240              #辅助测试机器私网IP
    range 0 src ip inc 0.0.0.0
    range 0 size start 64                           #包大小(最小为64)
    range 0 size min 64
    range 0 size max 64
    range 0 size inc 0
    range 0 dst ip start 192.168.222.151            #被测试机器私网IP
    range 0 dst ip min 192.168.222.151              #被测试机器私网IP
    range 0 dst ip inc 0.0.0.0
    enable all range
    start 0
    
    
  3. 在被测试机器pktgen中观察收包pps和对应的bps:
    alt

批量数据传输性能(bps)测试

使用iperf测试TCP bps性能

  1. 在被测试机器,执行以下命令,运行iperf服务器端。
    iperf -s -i 1

  2. 在辅助测试机器,执行以下命令,运行iperf客户端。
    iperf -c [dut_ip] -P 32 -t 60 -i 1

    [dut_ip]:被测试机器私有IP

  3. 在被测试机器,执行sar -n DEV 1命令,观测网络吞吐率,Gbps换算为 [rxkB/s] * 8 / 1000000:
    alt

使用Pktgen-DPDK测试UDP bps性能

说明

使用Pktgen-DPDK测试前,需分别在被测试机器和辅助测试机器将测试使用的网卡绑定到igb_uio,并配置大页内存。详细操作请参考上方安装Pktgen-DPDK

  1. 在被测试机器和辅助测试机器分别执行如下操作,运行pktgen。
    1. 执行vim run.sh命令,创建run.sh文件。
    2. i,进入编辑模式。
    3. 在run.sh文件中,输入如下内容。
      #!/bin/bash
      
      pktgen_dir=/root/Pktgen-DPDK/          # 修改为您服务器上已经编译的Pktgen-DPDK源代码目录
      nic_bdf=00:07.0                        # 修改为您服务器上已经绑定igb_uio的网卡PCI地址
      
      $pktgen_dir/build/app/pktgen -c 0xffff1 -n 4 -a $nic_bdf -- -P -m "[1-32:1-32].0"
      
      

      说明:

      • 0xffff1:表示进程使用的CPU掩码,其中最低BIT CPU用于shell控制,其他CPU可以用于端口收发包。
      • [1-32:1-32].0:表示CPU编号,该CPU编号不能超出掩码中用于收发包的CPU范围。
        • 1-32(冒号前):用于收包
        • 1-32(冒号后):用于发包
        • .0:表示端口为0
    4. Esc退出编辑模式,然后输入:wq并回车。
    5. 执行chmod +x run.sh指令,赋予run.sh文件执行权限。
    6. 执行bash run.sh命令,运行脚本。
  2. 在辅助测试机器上执行以下命令,启动发包。
    set 0 proto udp
    range 0 src mac start 00:16:3e:2c:3b:5d        #辅助测试机器网络设备MAC地址
    range 0 src mac min 00:16:3e:2c:3b:5d          #辅助测试机器网络设备MAC地址
    range 0 src mac inc 00:00:00:00:00:00
    range 0 dst mac start 00:16:3e:37:78:b8        #被测试机器网络设备MAC地址
    range 0 dst mac min 00:16:3e:37:78:b8          #被测试机器网络设备MAC地址
    range 0 dst mac inc 00:00:00:00:00:00
    range 0 src port start 10000       
    range 0 src port min 10000         
    range 0 src port max 10000         
    range 0 src port inc 0
    range 0 dst port start 2000
    range 0 dst port min 2000
    range 0 dst port max 2255
    range 0 dst port inc 1
    range 0 proto udp
    range 0 src ip start 192.168.222.240            #辅助测试机器私网IP
    range 0 src ip min 192.168.222.240              #辅助测试机器私网IP
    range 0 src ip inc 0.0.0.0
    range 0 size start 1400                           #包大小(最小为64)
    range 0 size min 1400
    range 0 size max 1400
    range 0 size inc 0
    range 0 dst ip start 192.168.222.151            #被测试机器私网IP
    range 0 dst ip min 192.168.222.151              #被测试机器私网IP
    range 0 dst ip inc 0.0.0.0
    enable all range
    start 0
    
    
  3. 在被测试机器pktgen中观察收包pps和对应的bps,Gbps换算为 [MBit/s] /1000:
    alt

后续操作

使用Pktgen-DPDK测试完成后,可根据需要将测试用的网口绑定到原来的驱动。本文以将网口绑定到virito-pci为例。

  1. 创建bind-virtio.sh脚本,将测试用网口绑定到igb_uio。
    1. 执行vim bind-virtio.sh命令,创建bind-virtio.sh文件。
    2. i,进入编辑模式。
    3. 在bind-virtio.sh文件中,输入如下内容。
      #!/bin/bash
      
      dpdk_dir=/root/dpdk/     # 修改为您的云服务器的DPDK源代码目录
      nic_bdf=00:07.0          # 需改为您需要绑定igb_uio的网卡PCI地址
      
      ifconfig $eth_str down ; echo $?
      
      cd $dpdk_dir ; ./usertools/dpdk-devbind.py --unbind $nic_bdf ; echo $?
      
      rmmod igb_uio ; echo $?
      
      cd $dpdk_dir ; ./usertools/dpdk-devbind.py --bind=virtio-pci $nic_bdf ; echo $?
      
      eth_int=0
      while [ "$eth_int" == "0" ]
      do
        eth_int=$(ls -l /sys/class/net/ | grep $nic_bdf | wc -l)
      done
      
      net_str=$(ls -l /sys/class/net/ | grep $nic_bdf)
      eth_str=${net_str##*/}
      
      eth_int=0
      while [ "$eth_int" == "0" ]
      do
        eth_int=$(ifconfig -a | grep $eth_str | wc -l)
      done
      
      ifconfig $eth_str up; echo $?
      
      
    4. Esc退出编辑模式,然后输入:wq并回车。
    5. 执行chmod +x bind-virtio.sh指令,赋予bind-virtio.sh文件执行权限。
    6. 执行bash bind-virtio.sh命令,运行脚本。