参考来源:
极客时间: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(时间线对齐)