本文档介绍如何通过 DPDK 方法进行云服务器高吞吐网络性能测试。
yum install -y sysstat wget tar automake make gcc
wget http://git.dpdk.org/dpdk/snapshot/dpdk-17.11.tar.gz
tar -xf dpdk-17.11.tar.gz
mv dpdk-17.11 dpdk
dpdk/app/test-pmd/txonly.c
文件。vim dpdk/app/test-pmd/txonly.c
按 i 进入编辑模式,修改以下内容:#include "testpmd.h"
,另起一行输入如下内容:RTE_DEFINE_PER_LCORE(struct udp_hdr, lcore_udp_hdr);
修改完成后,如下图所示: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,
修改完成后,如下图所示:dpdk/config/common_base
文件。vim dpdk/config/common_base
按 i 进入编辑模式,找到 CONFIG_RTE_MAX_MEMSEG=256
,将其修改为1024。修改完成后如下图所示:说明:接受及发送端机器均需修改以上配置文件,您可使用以下命令,将修改完成的文件发送至对端,避免重复修改。
scp -P 22 /root/dpdk/app/test-pmd/txonly.c root@<IP地址>:/root/dpdk/app/test-pmd/ scp -P 22 /root/dpdk/config/common_base root@<IP地址>:/root/dpdk/config
dpdk/app/test-pmd/txonly.c
的 IP 地址修改为测试机器所用 IP。vim dpdk/app/test-pmd/txonly.c
按 i 进入编辑模式,找到如下内容:#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替换为机器 IP,SRC_ADDR 为发送端 IP,DST_ADDR 为接收端 IP。dpdk/
目录下执行以下命令,关闭 KNI。sed -i "s/\(^CONFIG_.*KNI.*\)=y/\1=n/g" ./config/*
sed -i "s/\(^WERROR_FLAGS += -Wundef -Wwrite-strings$\)/\1 -Wno-address-of-packed-member/g" ./mk/toolchain/gcc/rte.vars.mk
sed -i "s/fall back/falls through -/g" ./lib/librte_eal/linuxapp/igb_uio/igb_uio.c
make defconfig
make -j
执行以下命令,配置大页内存。
echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
若出现报错信息,则说明大页内存不足,可调整命令配置。例如:
echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
说明:该步骤需使用 Python,请前往 Python 官网 下载并安装所需版本。本文以 Python 3.6.8 为例。
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
完成测试后,可通过请执行以下命令,恢复网卡变更。说明:命令中的 00.05.0 为示例地址,请执行以下命令,获取网卡实际地址。
python3 dpdk-devbind.py -s
cd /root/dpdk/usertools/
python3 dpdk-devbind.py --bind=virtio-pci 00:05.0
ifconfig eth0 up
说明:
- 测试命令通过 txpkts 参数控制发包大小,测试带宽使用1430B,测试 pps 使用64B。
- 此步骤的命令参数适用于 CentOS 8.2 操作系统。若使用其他系统镜像版本,则需结合实际场景调整参数后重新测试。例如,CentOS 7.4 内核版本为3.10,与 CentOS 8.2 的内核版本4.18存在性能差异,可将带宽测试命令中的
nb-cores
修改为2。关于命令参数的更多信息,请参见 estpmd-command-line-options。
/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
/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
得出如下图所示测试结果:可根据接收端 PPS 和测试包长来计算当前网络的接收带宽,公式如下:
PPS × packet length × 8bit/B × 10-9 = 带宽
结合测试得出数据,可得当前带宽为:
4692725pps × 1430B × 8bit/B × 10-9 ≈ 53Gbps
说明:
- 报文长度1430B,包含14B以太网头、8B CRC 以及20B IP 头。
- 测试结果中 Rx-pps 为瞬时统计值,您可多次测试求其平均值,得到更准确的结果。
本页内容是否解决了您的问题?