pktgen是内核的一个模块,用来发送大量的报文,由于pktgen工作在内核状态下,因此,pktgen可以具有很高的发报效率。
在开发测试底层网卡性能时,通常需要使用smartbits等专业测试工具来测试,但smartbits通常都非常昂贵,不是一般小公司或个人可以负担,这时,你可以使用pktgen来做近似的测试。
使用pktgen,首先需要加载pktgen模块,如果你的内核没有把pktgen编译进内核,或编译成模块,你需要重新编译内核。pktgen在内核的network下。
modprobe pktgen
pktgen使用脚本来控制发报的行为和方式,主要的控制项有以下一些参数:
cpu,用于发送报文的cpu与发送网卡之间的关系
网卡,用于发送报文的网卡,可以有多个
发送报文数
发送延迟
报文大小
通常,我们使用64byte的报文进行测试,这样,现在一般的xeon四核 2.33G服务器可发送到120万左右的速度,接近于线速148万pps(packets per second)
下面是我使用的pktgen脚本:
[shell]
#! /bin/sh
#modprobe pktgen
pgset() {
local result
echo $1 > $PGDEV
result=`cat $PGDEV | fgrep "Result: OK:"`
if [ "$result" = "" ]; then
cat $PGDEV | fgrep Result:
fi
}
pg() {
echo inject > $PGDEV
cat $PGDEV
}
# Config Start Here ————————————————
# thread config
# Each CPU has own thread. Two CPU exammple. We add eth3, eth2 respectivly.
PGDEV=/proc/net/pktgen/kpktgend_0
echo "Removing all devices"
pgset "rem_device_all"
echo "Adding eth3"
pgset "add_device eth3"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 10000"
PGDEV=/proc/net/pktgen/kpktgend_1
echo "Removing all devices"
pgset "rem_device_all"
echo "Adding eth2"
pgset "add_device eth2"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 10000"
# device config
# delay 0 means maximum speed.
CLONE_SKB="clone_skb 1000000"
# NIC adds 4 bytes CRC
PKT_SIZE="pkt_size 60"
# COUNT 0 means forever
#COUNT="count 0"
COUNT="count 0"
DELAY="delay 0"
PGDEV=/proc/net/pktgen/eth3
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"
pgset "$DELAY"
pgset "dst 10.10.11.2"
pgset "dst_mac 00:04:23:08:91:dc"
PGDEV=/proc/net/pktgen/eth2
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"
pgset "$DELAY"
pgset "dst 192.168.2.2"
pgset "dst_mac 00:04:23:08:91:de"
# Time to run
PGDEV=/proc/net/pktgen/pgctrl
echo "Running… ctrl^C to stop"
pgset "start"
echo "Done"
# Result can be vieved in /proc/net/pktgen/eth[3,2]