file:///home/chenhao/backup/github/linux/Documentation/networking/pktgen.rst
… SPDX-许可证标识符:GPL-2.0
HOWTO for the linux packet generator
启用CONFIG_NET_PKTGEN
以在内核中编译和构建pktgen
或作为模块。首选模块;如果需要,请使用modprobe pktgen
。一旦
在运行时,pktgen将为每个与该CPU有亲和力的CPU创建一个线程。
监视和控制通过/ proc完成。选择一个最简单的合适的示例脚本并进行配置。
在双CPU上:
ps aux | grep pkt
root 129 0.3 0.0 0 0 ? SW 2003 523:20 [kpktgend_0]
root 130 0.3 0.0 0 0 ? SW 2003 509:50 [kpktgend_1]
为了监视和控制,pktgen创建:
/proc/net/pktgen/pgctrl
/proc/net/pktgen/kpktgend_X
/proc/net/pktgen/ethX
调整NIC以实现最佳性能
默认NIC设置(可能)未针对pktgen的人工调整
重载类型的基准测试,因为这可能会损害正常的用例。
专门增加NIC中的TX环形缓冲区:
#ethtool -G ethX TX 1024
较大的TX环可以改善pktgen的性能,同时可能会损坏
在一般情况下是1),因为TX环形缓冲区可能会变大
比CPU的L1 / L2缓存2)因为它允许在队列中进行更多的排队NIC硬件层(不利于缓冲)。
一个人应该犹豫得出结论,硬件中的数据包/描述符
TX振铃导致延迟。驱动通常会延迟清理
出于各种性能原因的环形缓冲区以及数据包停顿TX环可能只是在等待清理。
此清理问题是驱动程序ixgbe特有的情况
(英特尔82599芯片)。该驱动程序(ixgbe)结合了TX + RX环清理功能,
并且清理间隔受ethtool --coalesce设置的影响
参数“ rx-usecs”。
对于ixgbe,使用例如“ 30”,导致大约33K中断/秒(1/30 * 10 ^ 6):
#ethtool -C ethX rx-usecs 30
内核线程
Pktgen为每个与该CPU关联的CPU创建一个线程。
通过procfile /proc/net/pktgen/kpktgend_X控制。
Example: /proc/net/pktgen/kpktgend_0::
Running:
Stopped: eth4@0
Result: OK: add_device=eth4@0
最重要的是分配给线程的设备。
两个基本线程命令是:
- add_device DEVICE@NAME-添加一个设备
- rem_device_all-删除所有关联的设备
将设备添加到线程时,将创建一个对应的procfile用于配置此设备。因此,设备名称需要独一无二。
为了支持将同一设备添加到多个线程,这很有用
对于多队列NIC,设备命名方案使用“ @”扩展:
device@something
“ @”之后的部分可以是任何东西,但是消耗该线程数。
查看设备
参数部分保存配置的信息。当前部分保存运行统计信息。结果在运行之后或中断之后打印。例::
/proc/net/pktgen/eth4@0
Params: count 100000 min_pkt_size: 60 max_pkt_size: 60
frags: 0 delay: 0 clone_skb: 64 ifname: eth4@0
flows: 0 flowlen: 0
queue_map_min: 0 queue_map_max: 0
dst_min: 192.168.81.2 dst_max:
src_min: src_max:
src_mac: 90:e2:ba:0a:56:b4 dst_mac: 00:1b:21:3c:9d:f8
udp_src_min: 9 udp_src_max: 109 udp_dst_min: 9 udp_dst_max: 9
src_mac_count: 0 dst_mac_count: 0
Flags: UDPSRC_RND NO_TIMESTAMP QUEUE_MAP_CPU
Current:
pkts-sofar: 100000 errors: 0
started: 623913381008us stopped: 623913396439us idle: 25us
seq_num: 100001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0
cur_saddr: 192.168.8.3 cur_daddr: 192.168.81.2
cur_udp_dst: 9 cur_udp_src: 42
cur_queue_map: 0
flows: 0
Result: OK: 15430(c15405+d25) usec, 100000 (60byte,0frags)
6480562pps 3110Mb/sec (3110669760bps) errors: 0
配置设备
这是通过/ proc接口完成的,最容易通过pgset完成的
如示例脚本中所定义。
您需要指定PGDEV环境变量以使用示例中的函数脚本,即:
export PGDEV=/proc/net/pktgen/eth4@0
source samples/pktgen/functions.sh
例子::
pg_ctrl start 开始注入。
pg_ctrl stop 终止注入。同样,^ C中止生成器。
pgset “clone_skb 1” 设置相同数据包的副本数
pgset “clone_skb 0” 对所有传输使用单个SKB
pgset “burst 8” 使用xmit_more API将相同的8个副本排入队列
数据包并一次更新硬件TX队列尾指针。
默认为“连拍1”
pgset “pkt_size 9014” 将数据包大小设置为9014
pgset “frags 5” 数据包将包含5个片段
pgset “count 200000” 设置要发送的包数,设置为零连续发送,直到明确停止为止。
pgset“ delay 5000” 增加了对hard_start_xmit()的延迟。纳秒
pgset “dst 10.0.0.1” 设置IP目标地址
(注意!此生成器非常激进!)
pgset “dst_min 10.0.0.1” 与dst相同
pgset “dst_max 10.0.0.254” 设置最大目标IP。
pgset "src_min 10.0.0.1"设置最小(或唯一)源IP。
pgset "src_max 10.0.0.254"设置最大源IP。
pgset “dst6 fec0::1” IPV6目标地址
pgset “src6 fec0::2” IPV6源地址
pgset "dstmac 00:00:00:00:00:00"设置MAC目标地址
pgset "srcmac 00:00:00:00:00:00"设置MAC源地址
pgset “queue_map_min 0” 设置发送队列间隔的最小值
pgset “queue_map_max 7” 设置多队列设备的tx队列间隔的最大值
要选择给定设备的队列1,
使用queue_map_min = 1和queue_map_max = 1
pgset “src_mac_count 1” 设置我们可以通过的MAC数量。
srcmac设置的是“最小” MAC。
pgset “dst_mac_count 1” 设置我们可以通过的MAC数量。
dstmac设置的是“最小” MAC。
pgset “flag [name]” 设置标志以确定行为。当前标志
分别是:IPSRC_RND#IP源是随机的(最小/最大之间)
IPDST_RND#IP目的地是随机的
UDPSRC_RND,UDPDST_RND,
MACSRC_RND,MACDST_RND
TXSIZE_RND,IPV6,
MPLS_RND,VID_RND,SVID_RND
FLOW_SEQ,
QUEUE_MAP_RND#队列映射随机
QUEUE_MAP_CPU#队列映射镜像smp_processor_id()
UDPCSUM,
IPSEC#IPsec封装(需要CONFIG_XFRM)
NODE_ALLOC#特定于节点的内存分配
NO_TIMESTAMP#禁用时间戳
pgset ‘flag ![name]’ 清除标志以确定行为。
请注意,您可能需要在其中使用单引号
交互模式,这样您的外壳将不会扩展
指定的标志作为历史命令。
pgset “spi [SPI_VALUE]” 设置用于转换数据包的特定SA。
pgset “udp_src_min 9” 设置UDP源端口的最小值,如果<udp_src_max,则
在端口范围内循环。
pgset “udp_src_max 9” 设置UDP源端口最大值。
pgset “udp_dst_min 9” 设置UDP目标端口的最小值,如果<udp_dst_max,则
在端口范围内循环。
pgset “udp_dst_max 9” 设置UDP目标端口最大值。
pgset “mpls 0001000a,0002000a,0000000a” 设置MPLS标签(在此示例中
外标签= 16,中标签= 32,
内部标签= 0(IPv4 NULL))注意
之间必须没有空格
论点。前导零是必需的。
不要设置堆栈位的底部,
那是自动完成的。如果你这样做
设置堆栈位的底部
表示您要随机
生成该地址和标志
MPLS_RND将打开。您
可以具有随机和固定的任意组合
标签堆栈中的标签。
pgset “mpls 0” 关闭mpls(或者任何无效的参数也可以!)
pgset “vlan_id 77” 设置VLAN ID 0-4095
pgset “vlan_p 3” 设置优先级位0-7(默认0)
pgset “vlan_cfi 0” 设置规范格式标识符0-1(默认为0)
pgset “svlan_id 22” 设置SVLAN ID 0-4095
pgset “svlan_p 3” 设置优先级位0-7(默认0)
pgset “svlan_cfi 0” 设置规范格式标识符0-1(默认为0)
pgset “vlan_id 9999” > 4095移除vlan和svlan标签
pgset “svlan 9999” > 4095移除svlan标签
pgset “tos XX” 设置了以前的IPv4 TOS字段(例如AF11 no ECN的“ tos 28”,默认为00)
pgset “traffic_class XX” 设置了以前的IPv6流量类别(例如,对于EF no ECN,默认为“ traffic_class B8”,默认为00)
pgset “rate 300M” 将速率设置为300 Mb / s
pgset “ratep 1000000” 将速率设置为1Mpps
pgset “xmit_mode netif_receive” RX注入到堆栈中netif_receive_skb()
适用于“burst突发”,但不适用于“ clone_skb”。
默认的xmit_mode是“ start_xmit”。
样例脚本
pktgen的教程脚本和帮助程序的集合位于samples / pktgen目录。帮助parameters.sh文件支持简单
以及一致参数解析的跨示例脚本。
用法示例和帮助::
./pktgen_sample01_simple.sh -i eth4 -m 00:1B:21:3C:9D:F8 -d 192.168.8.2
用法:::
./pktgen_sample01_simple.sh [-vx] -i ethX
-i:($ DEV)输出接口/设备(必需)
-s:($ PKT_SIZE)数据包大小
-d:($ DEST_IP)目标IP
-m:($ DST_MAC)目标MAC地址
-t:($ THREADS)个线程开始
-c:($ SKB_CLONE)SKB克隆在分配新SKB之前发送
-b:($ BURST)硬件级别的SKB突发
-v:($ VERBOSE)详细
-x:($ DEBUG)调试
还列出了设置的全局变量。例如要求接口/设备参数“ -i”设置变量$ DEV。复制
并修改pktgen_sampleXX脚本以适合您自己的需求。
旧脚本:
pktgen.conf-1-2 # 1 CPU 2 dev
pktgen.conf-1-1-rdos # 1 CPU 1 dev w. route DoS
pktgen.conf-1-1-ip6 # 1 CPU 1 dev ipv6
pktgen.conf-1-1-ip6-rdos # 1 CPU 1 dev ipv6 w. route DoS
pktgen.conf-1-1-flows # 1 CPU 1 dev multiple flows.
中断亲和力
请注意,将设备添加到特定CPU时,
还分配/proc/irq/XX/smp_affinity,以便绑定TX中断到同一个CPU。这样可以减少释放skb时的缓存反弹。
加上使用设备标志QUEUE_MAP_CPU,该标志映射SKB的TX队列到正在运行的线程CPU(直接从smp_processor_id())。
启用IPsec
带ESP封装和传输模式的默认IPsec转换,只需设置以下即可启用:
pgset "flag IPSEC"
pgset "flows 1"
为了避免破坏使用AH类型和隧道模式的现有测试平台脚本,您可以使用“ pgset spi SPI_VALUE”来指定哪种转换模式聘请。
当前命令和配置选项
** Pgcontrol命令** ::
start
stop
reset
线程命令 ::
add_device
rem_device_all
设备命令 ::
count
clone_skb
burst
debug
frags
delay
src_mac_count
dst_mac_count
pkt_size
min_pkt_size
max_pkt_size
queue_map_min
queue_map_max
skb_priority
tos (ipv4)
traffic_class (ipv6)
mpls
udp_src_min
udp_src_max
udp_dst_min
udp_dst_max
node
flag
IPSRC_RND
IPDST_RND
UDPSRC_RND
UDPDST_RND
MACSRC_RND
MACDST_RND
TXSIZE_RND
IPV6
MPLS_RND
VID_RND
SVID_RND
FLOW_SEQ
QUEUE_MAP_RND
QUEUE_MAP_CPU
UDPCSUM
IPSEC
NODE_ALLOC
NO_TIMESTAMP
spi (ipsec)
dst_min
dst_max
src_min
src_max
dst_mac
src_mac
clear_counters
src6
dst6
dst6_max
dst6_min
flows
flowlen
rate
ratep
xmit_mode <start_xmit|netif_receive>
vlan_cfi
vlan_id
vlan_p
svlan_cfi
svlan_id
svlan_p
参考文献:
-ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/
-tp://robur.slu.se/pub/Linux/net-development/pktgen-testing/examples/
2004年Erlangen的Linux-Kongress论文。
-ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/pktgen_paper.pdf
谢谢:
Grant Grundler在IA-64和parisc上进行测试,Harald Welte和Lennert Buytenhek
Stephen Hemminger,Andi Kleen,Dave Miller等。
祝您在linux上净发展。