dpvs是一个基于dpdk实现的高性能四层负载均衡,最近在学习怎么测试四层lb各种性能指标。简单罗列了下dpvs需要关注的性能指标:
指标 | 说明 |
---|---|
单向pps | 指入向每秒可以处理的数据包个数极限值,测试单向pps性能一般使用udp小包(因为udp是无状态的,比较简单),当dpvs出现imiss的时候则达到极限值 |
双向pps | 即入向+出向pps极限值,需要在rs上部署udp server |
bps | 指dpvs每秒可以处理的数据包长度的极限值,一半可以使用udp大包来测试 |
cps | 指每秒新建连接的极限值,新建连接一般是指tcp三次握手后处于的establish状态 |
cc | 最大并发连接数 |
大象流 | 单条流即单核最大bps/pps |
用测试仪其实很容易测到以上指标,但是一是测试仪比较昂贵,二是需要直连测试仪到测试环境,没有这些条件,只能使用其他性能测试工具。目前比较常用且简单的测试工具有两个:pktgen和wrk。
上述两个工具很简单好用,但也有一些不足,比如pktgen没法测试双向pps,要测试双向pps,需要在rs上部署高性能的udp_server;wrk性能不够,一般只能测试1核或者2核的dpvs性能。。。
dperf是一个基于dpdk的高性能网络压测工具。dperf可用作client,也可用作server,所以可以测试双向pps;dperf的性能表现也比wrk强太多,所以我希望dperf可以解决上述工具的问题,并且可以独自测试dpvs所有的性能指标。
# 由于我是mlx网卡,所以需要安装官方的ofed网卡驱动,需要注意的是cx6网卡需要安装ofed 5.4版本,
# 可以登陆这个页面自行下载安装包https://www.mellanox.com/page/mlnx_ofed_eula?mtag=linux_sw_drivers&mrequest=downloads&mtype=ofed&mver=MLNX_OFED-5.4-3.0.3.0&mname=MLNX_OFED_LINUX-5.4-3.0.3.0-debian9.13-x86_64.tgz
# 解压,安装ofed
tar xvf MLNX_OFED_LINUX-5.0-2.1.8.0-debian9.11-x86_64.tgz
cd MLNX_OFED_LINUX-5.0-2.1.8.0-debian9.11-x86_64/
./uninstall.sh --force
./mlnxofedinstall --dpdk --upstream-libs --skip-distro-check --add-kernel-support
# 配置大页内存
# 修改grub文件
vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet default_hugepagesz=1G hugepagesz=1G hugepages=49 iommu=pt intel_iommu=on"
# 生成启动脚本
update-grub
# 重启机器
reboot -f
# 下载dpdk-19.11.10安装包
# 解压后,修改config/common_base,打开编译开关:CONFIG_RTE_LIBRTE_MLX5_PMD=y
# X86_64环境下编译:
make install T=x86_64-native-linuxapp-gcc -j16
# 如需使用kni的话,加载kni:
insmod x86_64-native-linuxapp-gcc/kmod/rte_kni.ko
git clone https://github.com/baidu/dperf
cd /root/dperf
make -j8 RTE_SDK=/root/dpdk-stable-19.11.10 RTE_TARGET=x86_64-native-linuxapp-gcc
之后就可以执行./build/dperf -c test/http/server-cps.conf来启动dperf server,在客户端上修改test/http/client-cps.conf中的配置后,执行./build/dperf -c test/http/client-cps.conf即可启动dperf client,就可以进行cps压测了,具体配置详情请见:https://github.com/baidu/dperf/blob/main/docs/configuration-CN.md
单向pps只需要起一个udp client,配置如下:
mode client
cpu 0-15
duration 600s
cps 50k
cc 500k
rss l3l4
flood
protocol udp
packet_size 64
keepalive 100ms
port 0000:aa:00.0 10.10.10.10 10.10.10.1
client 10.10.10.10 1
server 10.10.10.11 1
listen 8050 50
lport_range 1000 65535
kni
pps的数量等于并发数除以keepalive的值,所以上述配置的pps可以达到5M。相对于pktgen来说,dperf并发数启动较慢,即使配置一个较大的cps值如500k,等待数秒之后才可以达到50w并发;pktgen基本可以瞬间达到50w并发。但是dperf有一个很大的优势就是可以较为精确的发出的pps值,用做自动化测试调参会比较方便。
双向pps需要起两个dperf,一个作为udp client,一个作为udp server,配置如下:
# client
mode client
cpu 0-15
duration 600s
cps 50k
cc 500k
rss l3l4
flood
protocol udp
packet_size 64
keepalive 100ms
port 0000:aa:00.0 10.10.10.10 10.10.10.1
client 10.10.10.10 1
server 10.10.10.11 1
listen 8050 50
lport_range 1000 65535
kni
# server
mode server
protocol udp
keepalive 100ms
payload_size 64
cpu 0-15
rss l3l4
duration 100m
port 0000:aa:00.0 10.10.10.11 10.10.10.1
client 10.10.10.10 1
server 10.10.10.11 1
listen 8050 50
kni
上述配置可以达到入向5M+出向5M pps流量。
测试bps用udp client发入向的udp大包即可,配置如下:
mode client
cpu 0-15
duration 600s
cps 50k
cc 500k
rss l3l4
flood
protocol udp
packet_size 500
keepalive 100ms
port 0000:aa:00.0 10.10.10.10 10.10.10.1
client 10.10.10.10 1
server 10.10.10.11 1
listen 8050 50
lport_range 1000 65535
kni
这个和单向pps配置一样,只有包长不一样,通过包长和pps可以算出带宽,上述配置大概是20G左右
dperf新建非常快,比dpvs释放连接的速度快很多,所以必须要配置非常多的四元组,才可以保证客户端的新建连接与dpvs上的cps一致。
需要注意的是dperf显示的skOpen并不是dpvs真实的cps,建议把dpvs的timeout先调小,然后使用以下命令监控dpvs上的cps。ipvsadm --stats只统计dpvs的新建连接,不会统计复用的连接。
#!/bin/bash
while true
do
pre=$(/bin/ipvsadm -ln --stats | grep -E 'UDP|TCP' | awk '{sum += $3};END {print sum}')
sleep 1
post=$(/bin/ipvsadm -ln --stats | grep -E 'UDP|TCP' | awk '{sum += $3};END {print sum}')
res=$((${post}-${pre}))
echo ${res}
done
dperf配置参考如下:
mode client
cpu 0-15
duration 600s
cps 100k
rss l3l4
protocol tcp
port 0000:aa:00.0 10.10.10.10 10.10.10.1
client 10.10.10.10 1
server 10.10.10.11 1
listen 8000 99
lport_range 1000 65535
kni
如果只有一个server ip,listen监听端口一定要配多一点。
dperf测试cc非常方便,配置足够多的四元组即可。
mode client
cpu 0-15
duration 600s
cps 500k
cc 5m
rss l3l4
flood
protocol udp
packet_size 64
keepalive 1s
port 0000:aa:00.0 10.10.10.10 10.10.10.1
client 10.10.10.10 1
server 10.10.10.11 1
listen 8000 99
lport_range 1000 65535
kni
上述配置可以轻松达到5m的并发数。
由于dperf配置中的keepalive最少只能配置10us,也就是单条流最大pps只有100k,而dpvs单核的pps性能约等于1M,所以pps大象流用dperf是无法达到极限值的;通过调大packet_size包长,最大是1500字节,所以单流bps最大1.2Gb,也没有办法达到dpvs的单核bps极限值,所以dperf无法测试dpvs的大象流场景,配置参考如下:
mode client
cpu 0-15
duration 600s
cps 1
cc 1
rss l3l4
flood
protocol udp
packet_size 1500
keepalive 100ms
port 0000:aa:00.0 10.10.10.10 10.10.10.1
client 10.10.10.10 1
server 10.10.10.11 1
listen 8050 1
lport_range 1000 65535
kni
总而言之,dperf是一个非常好用的软件性能测试工具,可以很方便的测试出了大象流以外的其他场景,部署简单,配置简单,同时可以用做高性能的client和server。也希望dperf后续能开发出更多的功能,适用更多的性能测试场景。