使用dperf测试dpvs性能

为什么选择dperf

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是一个基于linux内核的发包工具,它有一个升级版pktgen-dpdk,可以单机达到更高pps的压力,不过对于dpvs来说pktgen就足够了,一台mlx 25G网卡的客户端可以轻松发送16M的pps。pktgen可以调整发送udp包的大小,适用于测试单向pps、bps。pktgen还可以控制源端口的范围和目的端口的范围,也适用于测试cc和大象流。
  • wrk是一个七层的qps性能测试工具,对于短链接来说,我们可以近似的把qps看作cps,所以可以使用wrk来测试cps。

上述两个工具很简单好用,但也有一些不足,比如pktgen没法测试双向pps,要测试双向pps,需要在rs上部署高性能的udp_server;wrk性能不够,一般只能测试1核或者2核的dpvs性能。。。
dperf是一个基于dpdk的高性能网络压测工具。dperf可用作client,也可用作server,所以可以测试双向pps;dperf的性能表现也比wrk强太多,所以我希望dperf可以解决上述工具的问题,并且可以独自测试dpvs所有的性能指标。

部署dperf

  1. 编译dpdk
    由于dperf是基于dpdk的,所以首先要编译dpdk。编译dpdk又需要安装网卡驱动、配置大页内存等操作,可以参考我的以下操作:
# 由于我是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
  1. 编译dperf
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

单向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

双向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

测试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左右

测试cps

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监听端口一定要配多一点。

测试cc

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后续能开发出更多的功能,适用更多的性能测试场景。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值