本文介绍如何使用Pktgen测试云服务器的网络性能。
工具 | 测试指标 | 下载链接 |
---|---|---|
Linux pktgen | UDP pps, UDP bps | https://github.com/torvalds/linux/tree/master/samples/pktgen |
iperf2 | TCP bps | https://sourceforge.net/projects/iperf2 |
Pktgen-DPDK | UDP pps, UDP bps | https://github.com/pktgen/Pktgen-DPDK |
说明
本文的测试结果仅作为参考,不代表云服务器的真实最优性能。
参考 购买云服务器,准备被测试机器(DUT)和辅助测试机器(Tester)。使用Pktgen-DPDK测试时,每台云服务器需要准备两张网卡,分别用于登录运行命令和DPDK测试使用。
本文测试环境如下表所示:
ECS云服务器 | 云服务器信息 | 数量 | IP地址 | 说明 |
---|---|---|---|---|
被测试机器 |
| 1 | 192.168.222.151 | 被压力测试网络吞吐率的ECS实例。 |
辅助测试机器 |
| 1 | 192.168.222.240 | 与测试机间建立控制连接,传递测试信息及结果。 |
在被测试机器和辅助测试机器依次执行以下操作步骤,安装测试软件。
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
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测试使用。
创建build.sh脚本,下载DPDK和pktgen的源代码进行编译。
vim build.sh
命令,创建build.sh文件。i
,进入编辑模式。#!/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
Esc
退出编辑模式,然后输入:wq
并回车。chmod +x build.sh
指令,赋予build.sh文件执行权限。bash build.sh
命令,运行脚本。说明
若测试所用网络端口的队列数大于16,在编译前修改源代码app/pktgen-constants.h
中常量NUM_Q
的数值进行匹配。
执行如下命令,将DPDK动态库加入到系统配置。
echo "/usr/local/lib/x86_64-linux-gnu/" >> /etc/ld.so.conf /sbin/ldconfig -v
执行ethtool -i eth1
命令,获取用于DPDK测试的网卡的PCI地址。本文以DPDK测试网卡为eth1为例。
回显信息如下:
创建bind-igbuio.sh脚本,将测试用网口绑定到igb_uio。
vim bind-igbuio.sh
命令,创建bind-igbuio.sh文件。i
,进入编辑模式。#!/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 $?
Esc
退出编辑模式,然后输入:wq
并回车。chmod +x bind-igbuio.sh
指令,赋予bind-igbuio.sh文件执行权限。bash bind-igbuio.sh
命令,运行脚本。执行如下命令,配置大页内存。本文假设实例有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
使用Linux pktgen测试UDP pps性能
在辅助测试机器,执行如下命令进行发包。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
在被测试机器执行sar -n DEV 1
,观测网络吞吐率。
回显如下:
使用Pktgen-DPDK测试UDP pps性能
说明
使用Pktgen-DPDK测试前,需分别在被测试机器和辅助测试机器将测试使用的网卡绑定到igb_uio,并配置大页内存。详细操作请参考上方安装Pktgen-DPDK。
vim run.sh
命令,创建run.sh文件。i
,进入编辑模式。#!/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
Esc
退出编辑模式,然后输入:wq
并回车。chmod +x run.sh
指令,赋予run.sh文件执行权限。bash run.sh
命令,运行脚本。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
使用iperf测试TCP bps性能
在被测试机器,执行以下命令,运行iperf服务器端。iperf -s -i 1
在辅助测试机器,执行以下命令,运行iperf客户端。iperf -c [dut_ip] -P 32 -t 60 -i 1
[dut_ip]:被测试机器私有IP
在被测试机器,执行sar -n DEV 1
命令,观测网络吞吐率,Gbps换算为 [rxkB/s] * 8 / 1000000:
使用Pktgen-DPDK测试UDP bps性能
说明
使用Pktgen-DPDK测试前,需分别在被测试机器和辅助测试机器将测试使用的网卡绑定到igb_uio,并配置大页内存。详细操作请参考上方安装Pktgen-DPDK。
vim run.sh
命令,创建run.sh文件。i
,进入编辑模式。#!/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
Esc
退出编辑模式,然后输入:wq
并回车。chmod +x run.sh
指令,赋予run.sh文件执行权限。bash run.sh
命令,运行脚本。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
使用Pktgen-DPDK测试完成后,可根据需要将测试用的网口绑定到原来的驱动。本文以将网口绑定到virito-pci为例。
vim bind-virtio.sh
命令,创建bind-virtio.sh文件。i
,进入编辑模式。#!/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 $?
Esc
退出编辑模式,然后输入:wq
并回车。chmod +x bind-virtio.sh
指令,赋予bind-virtio.sh文件执行权限。bash bind-virtio.sh
命令,运行脚本。