内核pktgen发包压测实用脚本

2023年 8月 18日 56.1k 0

边学边做,法力无边

make pktgen great again

网络性能测试指标和工具

网络开发不可避免需要回答的问题,你的性能如何。
包括但不限于,吞吐、延时、PPS,RPS,CPS..

不同的压测工具,回答不一样的测试问题,有时候对工具指标错误理解和使用也会造成测试结果不符合预期,对性能优化给出错误地指引。

pktgen/dpdk-pktgen

pktgen 存在已久,直接绕开内核协议栈,发送udp报文,可以达到很高PPS,也是测试PPS的利器。当dpdk-pktgen出来后,往往首选都会是dpdk的方案,似乎是因为可以打到更高的PPS。但是实际上内核pktgen配置几个多线程也能打到20Mpps甚至以上,而被压测的软件处理能力往往低于这个数值。

第二个点是当我们的测试场景是使用虚拟机的时候,往往可能是virtio网卡或者仅有一个网卡的时候,使用dpdk意味着有可能我们因为操作不当造成机器网卡被完全接管而失联,这个时候内核的pktgen就比较安全了。

其他四层网络常见的压测工具

  • iperf/iperf3:这两差不多,一端服务端 iperf -S, 一端做客户端iperf -C
    这可以直接测量tcp的吞吐能力,指定-u 可以切换成udp,也能用udp压测pps,具体怎么用不再详细描述。
  • netperf: 最主要的是可以-t 指定测试场景,比如TCP_RR, TCP_CRR, UDP_RR,用来测试端到端单项发,收发来回等场景下的性能指标,特别是 RR场景下可以测试TCP/UDP的延时,相比ping测试的延时,对业务更有价值,有些软件实现可能icmp特殊处理会很快。CRR 场景则可以输出每秒钟新建能力。
  • ping: 不用说,icmp报文大小包的延时

辅助观测工具

  • sysstat: sar -n DEV 1 观测收发压力
  • ethtool: ethtool -S eth- 也能grep 收发包指标,imiss指标
  • perf: 观测软件性能热点

如果是七层网络测试可能还需要wrk压测http能力。
至此基本能覆盖PPS,吞吐,延时,RPS等测试指标

操作pktgen

“make pktgen great again”
正如开篇所说,内核pktgen主要也是测PPS能力,且很多时候也有使用上的优势。

具体的操作参考内核pktgen文档
www.kernel.org/doc/Documen…

这里不做详细描述,只举几个例子

 pgset "clone_skb 1"     sets the number of copies of the same packet
 pgset "burst 8"         uses xmit_more API to queue 8 copies of the same
                         packet and update HW tx queue tail pointer once.
                         "burst 1" is the default
 pgset "count 200000"    sets number of packets to send, set to zero
                         for continuous sends until explicitly stopped.

 pgset "dst 10.0.0.1"    sets IP destination address
                         (BEWARE! This generator is very aggressive!)

 pgset "dst_min 10.0.0.1"            Same as dst
 pgset "dst_max 10.0.0.254"          Set the maximum destination IP.
 pgset "src_min 10.0.0.1"            Set the minimum (or only) source IP.
 pgset "src_max 10.0.0.254"          Set the maximum source IP.
 pgset "dstmac 00:00:00:00:00:00"    sets MAC destination address
 pgset "srcmac 00:00:00:00:00:00"    sets MAC source address

 pgset "rate 300M"        set rate to 300 Mb/s
 pgset "ratep 1000000"    set rate to 1Mpps

比如配置了报文复制skb数目,能有效提高发包压力,count则是指定发包数目,不限制则设置0.
配置目的IP可以单个ip也可以是一个范围值,port,mac都是如此。提高报文随机能力。
还可以设置发包限速能力。

这里pgset的操作实际上是对文件/proc/net/pktgen/ethX@n 操作。
上面的例子就是通过echo 对应字符串到这个文件实现对内核pktgen的控制。

具体脚本实现和例子参看

github.com/torvalds/li…

内核项目这里提供了几个例子脚本,每次测试都可以拷贝到目标机器上执行。但是显然效率低下,脚本的事情可以考虑交给python pypi,然后每次pip install来实现脚本的分发安装。

实现一个python脚本

  • 可以处理配置输入,argparse处理输入如上面例子一样比如 --clone --burst等参数。
  • 可以处理一个--file 来指定配置文件,保存常用的测试配置输入。
  • 脚本内可以操作pktgen控制文件,实现shell脚本能力
  • 读取pktgen控制文件的输出,获取发包数据量,PPS等数据,并实时展示

第一步实现了上述能力,基本上在测试vm2vm场景下已经很够用了。

后面希望在gw场景下测试,需要对pktgen本身支持vxlan,当然也可以开一个vm对gw打包。

  • pktgen直接发vxlan包
  • 给xmit mode添加一个微突发能力,支持微突发压力测试

这部分需要修改pktgen 内核源码,提供新的配置字符串接口。并且要支持pktgen源码在pypi安装时候编译安装操作。好在pypi支持自定义安装来实现这个的能力。

在setup.py 实现

class CustomInstall(install):
    """ CustomInstall to build pktgen from source when install
    """
    def run(self):
        with subprocess.Popen(
            ["make", "-C", "pktperf/module", "install"], shell=False
        ) as process:
            process.wait()
        super().run()

对内核pktgen的ko源码修改可以提供新的功能支持。

内核内的vxlan支持可以参考原本port设置,ip设置等操作,直接添加一个对内外层报文的支持,如果要通用话,后面还可以考虑支持不同的隧道类型。

内核内的微突发发包,是在send函数实现,用一个 发停发 的间隔发包来实现。

具体代码都在 github.com/junka/pktpe…

直接使用则是 pip install pktperf,低版本的python在执行自定安装可能有问题。需要3.6含以上... 配置参数的话,还是看看README吧。

知识回顾

  • 学习了pktgen的使用和实现python脚本控制
  • 学习了python脚本的pypi的编写和发布过程
  • 学习了pktgen的源码,并能够修改ko的源码实现新的能力
  • 学习了pypi发布C源码下怎么在安装时编译
  • 最终是解决一个测试需要,简化工具使用成本,输出了一个pypi包供分发和使用

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论