工具使用-网络性能测试工具- PPS 的测试方法

参考来源:
极客时间:Linux性能优化实战-网路篇
CSDN站内文章:
pktgen工具使用及案例整理
内核pktgen使用
DPDK-Pktgen的使用

工具介绍:

今天我再来介绍另一个更常用的工具,Linux 内核自带的高性能网络测试工具 pktgen。
pktgen 支持丰富的自定义选项,方便你根据实际需要构造所需网络包,从而更准确地测试出目标服务器的性能。

演示示意图
以发包测试为例,假设发包机器使用的网卡是 ens33,而目标机器的 IP 地址为192.168.255.129,MAC 地址为00:0c:29:86:3e:3d 。
在这里插入图片描述

操作流程步骤

1.加载 pktgen 内核模块(modprobe pktgen)
2.给内核线程 kpktgend_X 添加测试网卡
3.配置发包的参数,包的数量,每个包的大小,发包间隔时间,目标ip和mac等;(可通过shell脚本实现,也可手工修改)
4.启动测试
5.等待测试完成,查看测试结果

1.加载 pktgen 内核模块

不过,在 Linux 系统中,你并不能直接找到 pktgen 命令。因为 pktgen 作为一个内核线
程来运行,需要你加载 pktgen 内核模块后,再通过 /proc 文件系统来交互。下面就是
pktgen 启动的两个内核线程和 /proc 文件系统的交互文件:

$ modprobe pktgen
$ ps -ef | grep pktgen | grep -v grep
root 26384 2 0 06:17 ? 00:00:00 [kpktgend_0]
root 26385 2 0 06:17 ? 00:00:00 [kpktgend_1]
$ ls /proc/net/pktgen/
kpktgend_0 kpktgend_1 pgctrl

pktgen 在每个 CPU 上启动一个内核线程,并可以通过 /proc/net/pktgen 下面的同名文
件,跟这些线程交互;而 pgctrl 则主要用来控制这次测试的开启和停止。
在使用 pktgen 测试网络性能时,需要先给每个内核线程 kpktgend_X 以及测试网卡,配
置 pktgen 选项,然后再通过 pgctrl 启动测试。

如果 modprobe 命令执行失败,说明你的内核没有配置
CONFIG_NET_PKTGEN 选项。这就需要你配置 pktgen 内核模块(即
CONFIG_NET_PKTGEN=m)后,重新编译内核,才可以使用。

2.给内核线程 kpktgend_X 添加测试网卡

关键操作:
echo “add_device ens33” > /proc/net/pktgen/kpktgend_0
示例,观察添加网卡后会生成同样路径下生成一个ens33网卡文件

root@ub1804:/home/xiaoyue# cd /proc/net/pktgen/
root@ub1804:/proc/net/pktgen# ls
kpktgend_0  kpktgend_1  kpktgend_2  kpktgend_3  pgctrl
root@ub1804:/proc/net/pktgen# echo "add_device ens33" > /proc/net/pktgen/kpktgend_0
root@ub1804:/proc/net/pktgen# cat kpktgend_0
Running: 
Stopped: ens33 
Result: OK: add_device=ens33
root@ub1804:/proc/net/pktgen# ls
ens33  kpktgend_0  kpktgend_1  kpktgend_2  kpktgend_3  pgctrl

3.配置发包的参数

3.1手工配置发包参数

root@ub1804:/proc/net/pktgen# echo "pkt_size 64" > /proc/net/pktgen/ens33
root@ub1804:/proc/net/pktgen# echo "count 1000000" > /proc/net/pktgen/ens33
root@ub1804:/proc/net/pktgen# echo "dst_mac 00:0c:29:86:3e:3d" > /proc/net/pktgen/ens33
root@ub1804:/proc/net/pktgen# echo "dst 192.168.255.129" > /proc/net/pktgen/ens33

3.2查看配置发包参数

root@ub1804:/proc/net/pktgen# cat  /proc/net/pktgen/ens33
Params: count 1000000  min_pkt_size: 64  max_pkt_size: 64
     frags: 0  delay: 0  clone_skb: 0  ifname: ens33
     flows: 0 flowlen: 0
     queue_map_min: 0  queue_map_max: 0
     dst_min: 192.168.255.129  dst_max: 
     src_min:   src_max: 
     src_mac: 00:0c:29:ca:d9:ca dst_mac: 00:0c:29:86:3e:3d
     udp_src_min: 9  udp_src_max: 9  udp_dst_min: 9  udp_dst_max: 9
     src_mac_count: 0  dst_mac_count: 0
     Flags: 
Current:
     pkts-sofar: 0  errors: 0
     started: 0us  stopped: 0us idle: 0us
     seq_num: 0  cur_dst_mac_offset: 0  cur_src_mac_offset: 0
     cur_saddr: 0.0.0.0  cur_daddr: 192.168.255.129
     cur_udp_dst: 0  cur_udp_src: 0
     cur_queue_map: 0
     flows: 0
Result: OK: dst_min=192.168.255.129

3.2脚本配置文件方式发包(可重用)

一个发包测试的示例。

#!/bin/bash
# 定义一个工具函数,方便后面配置各种测试选项
function pgset() {
    local result
    echo $1 > $PGDEV
    result=`cat $PGDEV | fgrep "Result: OK:"`
    if [ "$result" = "" ]; then
          cat $PGDEV | fgrep Result:
    fi
}

# 为 0 号线程绑定 ens33 网卡
PGDEV=/proc/net/pktgen/kpktgend_0
pgset "rem_device_all" # 清空网卡绑定
pgset "add_device ens33" # 添加 ens33 网卡

# 配置 eth0 网卡的测试选项
PGDEV=/proc/net/pktgen/ens33     #和添加的网卡名称一致
pgset "count 1000000" # 总发包数量
pgset "delay 5000" # 不同包之间的发送延迟 (单位纳秒)
pgset "clone_skb 0" # SKB 包复制
pgset "pkt_size 64" # 网络包大小
pgset "dst 192.168.255.129" # 目的 IP
pgset "dst_mac 00:0c:29:86:3e:3d" # 目的 MAC

# 启动测试
PGDEV=/proc/net/pktgen/pgctrl
echo "Running... ctrl^C to stop"
pgset "start"
echo "Done"

# Result can be viewed in /proc/net/pktgen/ens33

结果示例

root@ub1804:/home/xiaoyue# cat /proc/net/pktgen/ens33 
Params: count 1000000  min_pkt_size: 64  max_pkt_size: 64
     frags: 0  delay: 5000  clone_skb: 0  ifname: ens33
     flows: 0 flowlen: 0
     queue_map_min: 0  queue_map_max: 0
     dst_min: 192.168.255.129  dst_max: 
     src_min:   src_max: 
     src_mac: 00:0c:29:ca:d9:ca dst_mac: 00:0c:29:86:3e:3d
     udp_src_min: 9  udp_src_max: 9  udp_dst_min: 9  udp_dst_max: 9
     src_mac_count: 0  dst_mac_count: 0
     Flags: 
Current:
     pkts-sofar: 1000000  errors: 0
     started: 6598884978us  stopped: 6607562741us idle: 3466us
     seq_num: 1000001  cur_dst_mac_offset: 0  cur_src_mac_offset: 0
     cur_saddr: 192.168.255.132  cur_daddr: 192.168.255.129
     cur_udp_dst: 9  cur_udp_src: 9
     cur_queue_map: 0
     flows: 0
Result: OK: 8677762(c8674295+d3466) usec, 1000000 (64byte,0frags)
  115237pps 59Mb/sec (59001344bps) errors: 0

4.启动测试(手工配置方式下)

echo "start" > /proc/net/pktgen/pgctrl

5.等待测试完成,查看测试结果,使用sar工具验证

在这里插入图片描述

5.1测试结果解读

你可以看到,测试报告主要分为三个部分:

第一部分的 Params 是测试选项;
第二部分的 Current 是测试进度,其中, packts so far(pkts-sofar)表示已经发送了100 万个包,也就表明测试已完成。
第三部分的 Result 是测试结果,包含测试所用时间、网络包数量和分片、PPS、吞吐量以及错误数

根据上面的结果,我们发现,PPS 为 11 万,吞吐量为 60 Mb/s,没有发生错误。那么,12 万的 PPS 好不好呢?12 万的 PPS 好不好呢?(医生,血压180是啥意思?)

作为对比,你可以计算一下千兆交换机的 PPS。交换机可以达到线速(满负载时,无差错转发),它的 PPS 就是 1000Mbit 除以以太网帧的大小,即 1000Mbps/((64+20)*8bit)= 1.5 Mpps(其中,20B 为以太网帧前导和帧间距的大小)。

你看,即使是千兆交换机的 PPS,也可以达到 150 万 PPS,比我们测试得到的 12 万大多了。所以,看到这个数值你并不用担心,现在的多核服务器和万兆网卡已经很普遍了,稍做优化就可以达到数百万的 PPS。而且,如果你用了上节课讲到的 DPDK 或 XDP ,还能达
到千万数量级。

5.2测试结果交叉验证

在启动测试前使用sar工具在发包机器和目标机器上观察

sar -n DEV 1

关于工具命令输出的含义理解,能力要求的记忆掌握,方法是反复专注练习。
在这里插入图片描述

发包机器中的TXpck/s,115662的数值,和pktgen的结果输出接近。
在这里插入图片描述
目标机器上rxpck/s,同一时刻,51秒钟rxpck/s为117613(时间线对齐)
在这里插入图片描述

  • 29
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值