Linux pktgen使用

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上净发展。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值