简介

pktgen是Linux内核里包含的一个高性能发包工具,主要用来测试网络性能。一般情况下,使用pktgen就可以满足千兆网卡的测试需要。 pktgen运行在“内核态”,并不占用太多的系统资源,就可以达到非常高的发包速率。

pktgen只支持UDP发包(端口9)。因为pktgen是一个非常底层测试工具,而且一般是测试网络设备的性能,并不涉及到应用层面。如果要测试高级的网络应用的性能,请使用其它的测试工具。

Pktgen的优点是可以根据MAC地址来指定具体的发包端口,而不是根据路由。可以利用该内核工具来测试光模块/SFP+电缆吞吐量、还可以利用pktgen测试网卡的性能(服务器相同配置下不同网卡性能对比)。

本测试在内核原有pktgen模块的基础上打了pktgen_rx补丁,增加了收包的统计功能。

安装

Linux内核自带pktgen模块,不带rx统计功能,需要rx功能的话需要下载补丁pktgen_rx.tgz,下载地

实验环境:

机器型号:DELL R720

CPU: : Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz (20核40线程)

内核版本2.6.37

从以上网址下载pktgen_rx.tgz并解压,进入pktgen目录

拷贝内核源码至/usr/src/kernels/下,再编译

提示函数有问题,如下修改

改成

再编译

直接挂载就能使用

测试

测试拓扑

测试从eth6发包eth7收包shell脚本

pktgen.sh

#!/bin/sh

# pktgen.conf -- Sample configuration for send on two devices on a UP system

#modprobe pktgen

function pgset() {

local result

echo $1 > $PGDEV

result=`cat $PGDEV | fgrep "Result: OK:"`

if [ "$result" = "" ]; then

cat $PGDEV | fgrep Result:

fi

}

function pg() {

echo inject > $PGDEV

cat $PGDEV

}

#rx config

#Disable autonegotion in the interface

/sbin/ethtool -A $1 autoneg off rx off tx off

# Reception configuration   收包统计配置

PGDEV=/proc/net/pktgen/pgrx

echo "Removing old config"

pgset "rx_reset"

echo "Adding rx $1"

pgset "rx $1"

echo "Setting statistics $2(counters/basic/time)"

pgset "statistics $2"

pgset "display $3"

# pgset "display script/human"

# Result can be vieved in /proc/net/pktgen/eth1

#cat /proc/net/pktgen/pgrx

# We use eth6

echo "Adding devices to run".

PGDEV=/proc/net/pktgen/kpktgend_0

pgset "rem_device_all"

pgset "add_device eth6"  #根据实际测试更改网口设备

pgset "max_before_softirq 10000"

# Configure the individual devices

echo "Configuring devices"

PGDEV=/proc/net/pktgen/eth6   #根据实际测试更改网口设备

pgset "clone_skb 10000"

pgset "pkt_size 1514"  #根据实际测试更改包的大小

pgset "dst_mac 00:16:31:F0:84:D1"  #根据实际测试更改

pgset "count 0"   #设置count=0无限发包

# Time to run

PGDEV=/proc/net/pktgen/pgctrl

echo "Running... ctrl^C to stop"

pgset "start"

echo "Done"

运行的时候将$2设置为time,可以在/proc/net/pktgen/pgrx查看相关的jitter和lantency,如下

测试截图:

运行pktgen脚本截图

测试过程中数据流截图

对比eth6发包与eth7收包截图

从红框中可以看出收发包是一样的,而吞吐量大概达到了9.8G以上,当然发包的大小可以自己修改,测试中如果出现丢包情况,请多测试几次看看。

而从我测试来看,应该可以得到一个结论:CPU越好,每秒钟能发出的包数目越多,越有可能达到线速,在我的测试环境下,发包大概能达到4Mpps。

eth6发包eth7收包,并且eth7发包eth6收包shell脚本

pktgen_eth6_eth7.sh

#! /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.

/sbin/ethtool -A $1 autoneg off rx off tx off

# Reception configuration

PGDEV=/proc/net/pktgen/pgrx

echo "Removing old config"

pgset "rx_reset"

echo "Adding rx $1"

pgset "rx $1"

echo "Setting statistics $2"

pgset "statistics $2"

pgset "display human"

# pgset "display script"

PGDEV=/proc/net/pktgen/kpktgend_0

echo "Removing all devices"

pgset "rem_device_all"

echo "Adding eth6"

pgset "add_device eth6"

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 eth7"

pgset "add_device eth7"

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

#COUNT="count 0"

PKT_SIZE="pkt_size 1514"

COUNT="count 0"

DELAY="delay 0"

PGDEV=/proc/net/pktgen/eth6

echo "Configuring $PGDEV"

pgset "$COUNT"

pgset "$CLONE_SKB"

pgset "$PKT_SIZE"

pgset "$DELAY"

#pgset "src_min 100.1.1.2"

#pgset "src_max 100.1.1.254"

pgset "dst 200.1.1.2"

pgset "dst_mac 00:16:31:F0:84:D1"

PGDEV=/proc/net/pktgen/eth7

echo "Configuring $PGDEV"

pgset "$COUNT"

pgset "$CLONE_SKB"

pgset "$PKT_SIZE"

pgset "$DELAY"

#pgset "src_min 200.1.1.2"

#pgset "src_max 200.1.1.254"

pgset "dst 100.1.1.2"

pgset "dst_mac 00:16:31:F0:84:D0"

# Time to run

PGDEV=/proc/net/pktgen/pgctrl

echo "Running… ctrl^C to stop"

pgset "start"

echo "Done"

pktgen_eth6_eth7.sh可以只统计其中一个端口的数据:./pktgen_eth6_eth7.sh eth6 counters(选择counters/basic/time没有区别,原因未明)

也可以双端口都统计:直接运行./pktgen_eth6_eth7.sh。

注意:如果首先运行了pktgen_eth6_eth7.sh后,再去运行pktgen.sh的话,原本应该是只有eth6发包,但是结果是eth6和eth7都会发包。此时的处理方法是先卸载pktgen.ko再加载之。

以上两种测试在小包情况下发包只能达到4Mpps左右,要提高发包速率,采用多核多线程处理,代码如下(仍是从eth6发包eth7收包)

pktgen_multicore.sh

#! /bin/sh

# $1 Rate in packets per s

# $2 Number of CPUs to use

function pgset() {

local result

echo $1 > $PGDEV

}

# Reception configuration

PGDEV=/proc/net/pktgen/pgrx

echo "Removing old config"

pgset "rx_reset"

echo "Adding rx eth7"

pgset "rx eth7"

echo "Setting statistics counters"

pgset "statistics counters"

pgset "display human"

# pgset "display script"

# Result can be vieved in /proc/net/pktgen/eth1

#cat /proc/net/pktgen/pgrx

# Config Start Here -----------------------------------------------------------

# thread config

CPUS=$2

#PKTS=`echo "scale=0; $3/$CPUS" | bc`

CLONE_SKB="clone_skb 10000"

PKT_SIZE="pkt_size 60"

COUNT="count 0"

DELAY="delay 0"

MAC="00:16:31:F0:84:D1"

ETH="eth6"

RATEP=`echo "scale=0; $1/$CPUS" | bc`

for processor in {0..14}   #kpktgen_0到14

do

PGDEV=/proc/net/pktgen/kpktgend_$processor

#  echo "Removing all devices"

pgset "rem_device_all"

done

for ((processor=0;processor

do

PGDEV=/proc/net/pktgen/kpktgend_$processor

#  echo "Adding $ETH"

pgset "add_device $ETH@$processor"

PGDEV=/proc/net/pktgen/$ETH@$processor

#  echo "Configuring $PGDEV"

pgset "$COUNT"

pgset "flag QUEUE_MAP_CPU"

pgset "$CLONE_SKB"

pgset "$PKT_SIZE"

#pgset "$DELAY"

pgset "ratep $RATEP"

#pgset "dst 10.0.0.1"

pgset "dst_mac $MAC"

#Random address with in the min-max range

#pgset "flag IPDST_RND"

pgset "src_min 1.0.0.0"

pgset "src_max 100.255.255.255"

#enable configuration packet

#pgset "config 1"    #config [0 or 1] Enables or disables the configuration packet, which reset the statistics and allows to calculate the losses.

#pgset "flows 1024"

#pgset "flowlen 8"

done

# Time to run

PGDEV=/proc/net/pktgen/pgctrl

echo "Running... ctrl^C to stop"

pgset "start"

echo "Done"

同时设置网卡多队列与CPU的亲和性,如下

Eth6绑定CPU0-19

[root@localhost pktgen]# echo 1 > /proc/irq/122/smp_affinity

[root@localhost pktgen]# echo 2 > /proc/irq/123/smp_affinity

[root@localhost pktgen]# echo 4 > /proc/irq/124/smp_affinity

[root@localhost pktgen]# echo 8 > /proc/irq/125/smp_affinity

[root@localhost pktgen]# echo 10 > /proc/irq/126/smp_affinity

[root@localhost pktgen]# echo 20 > /proc/irq/127/smp_affinity

[root@localhost pktgen]# echo 40 > /proc/irq/128/smp_affinity

[root@localhost pktgen]# echo 80 > /proc/irq/129/smp_affinity

[root@localhost pktgen]# echo 100 > /proc/irq/130/smp_affinity

[root@localhost pktgen]# echo 200 > /proc/irq/131/smp_affinity

[root@localhost pktgen]# echo 400 > /proc/irq/132/smp_affinity

[root@localhost pktgen]# echo 800 > /proc/irq/133/smp_affinity

[root@localhost pktgen]# echo 1000 >/proc/irq/134/smp_affinity

[root@localhost pktgen]# echo 2000 >/proc/irq/135/smp_affinity

[root@localhost pktgen]# echo 4000 >/proc/irq/136/smp_affinity

[root@localhost pktgen]# echo 8000 >/proc/irq/137/smp_affinity

[root@localhost pktgen]# echo 10000 >/proc/irq/138/smp_affinity

[root@localhost pktgen]# echo 20000 >/proc/irq/139/smp_affinity

[root@localhost pktgen]# echo 40000 >/proc/irq/140/smp_affinity

[root@localhost pktgen]# echo 80000 >/proc/irq/141/smp_affinity

Eth7绑定CPU0-19

[root@localhost pktgen]# echo 1 > /proc/irq/143/smp_affinity

[root@localhost pktgen]# echo 2 > /proc/irq/144/smp_affinity

[root@localhost pktgen]# echo 4 > /proc/irq/145/smp_affinity

[root@localhost pktgen]# echo 8 > /proc/irq/146/smp_affinity

[root@localhost pktgen]# echo 10 > /proc/irq/147/smp_affinity

[root@localhost pktgen]# echo 20 > /proc/irq/148/smp_affinity

[root@localhost pktgen]# echo 40 > /proc/irq/149/smp_affinity

[root@localhost pktgen]# echo 80 > /proc/irq/150/smp_affinity

[root@localhost pktgen]# echo 100 > /proc/irq/151/smp_affinity

[root@localhost pktgen]# echo 200 > /proc/irq/152/smp_affinity

[root@localhost pktgen]# echo 400 > /proc/irq/153/smp_affinity

[root@localhost pktgen]# echo 800 > /proc/irq/154/smp_affinity

[root@localhost pktgen]# echo 1000 >/proc/irq/155/smp_affinity

[root@localhost pktgen]# echo 2000 >/proc/irq/156/smp_affinity

[root@localhost pktgen]# echo 4000 >/proc/irq/157/smp_affinity

[root@localhost pktgen]# echo 8000 >/proc/irq/158/smp_affinity

[root@localhost pktgen]# echo 10000 >/proc/irq/159/smp_affinity

[root@localhost pktgen]# echo 20000 >/proc/irq/160/smp_affinity

[root@localhost pktgen]# echo 40000 >/proc/irq/161/smp_affinity

[root@localhost pktgen]# echo 80000 >/proc/irq/162/smp_affinity

注意:网卡队列与CPU绑定时根据ip和端口来的,所以ip或者端口不能固定不变,不然绑定失效。本测试源ip打散发送。

测试结果表明,多队列与cpu绑定后发包和收包都得到很大的提升。(原先CPU单核接收最多只能达到2Mpps,设置绑定后达到了9.5Mpps左右,当然还可以继续提高。)

网卡默认的MTU是1500不能接收大于1518的数据包,因此可以更改其大小来接收比如8192byte字节数据包

ip link set dev eth6 mtu 8174

ip link set dev eth7 mtu 8174

修改后调整脚本中pkt_size至8188,eth7可以接收到数据(tcpdump抓包可看到,如果不进行更改,抓包会显示如下)

附:

配置项解释

Configuring threads and devices

================================

This is done via the /proc interface easiest done via pgset in the scripts

Examples:

pgset "clone_skb 1"    sets the number of copies of the same packet

pgset "clone_skb 0"    use single SKB for all transmits

pgset "pkt_size 9014"   sets packet size to 9014

pgset "frags 5"      packet will consist of 5 fragments

pgset "count 200000"    sets number of packets to send, set to zero for continuous sends until explicitly stopped.

pgset "delay 5000"     adds delay to hard_start_xmit(). nanoseconds

pgset "dst 10.0.0.1"    sets IP destination address(BEWARE! This generator is very aggressive!)

pgset "dst_min 10.0.0.1"  Same as dst

pgset "dst_max 10.0.0.254" Set the maximum destination IP.

pgset "src_min 10.0.0.1"  Set the minimum (or only) source IP.

pgset "src_max 10.0.0.254" Set the maximum source IP.

pgset "dst6 fec0::1"    IPV6 destination address

pgset "src6 fec0::2"    IPV6 source address

pgset "dstmac 00:00:00:00:00:00" sets MAC destination address

pgset "srcmac 00:00:00:00:00:00" sets MAC source address

pgset "queue_map_min 0" Sets the min value of tx queue interval

pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices.To select queue 1 of a given device, use queue_map_min=1 and queue_map_max=1

pgset "src_mac_count 1" Sets the number of MACs we'll range through.The 'minimum' MAC is what you set with srcmac.

pgset "dst_mac_count 1" Sets the number of MACs we'll range through.The 'minimum' MAC is what you set with dstmac.

pgset "flag [name]"   Set a flag to determine behaviour.  Current flags are:

IPSRC_RND #IP Source is random (between min/max),

IPDST_RND, UDPSRC_RND

UDPDST_RND, MACSRC_RND, MACDST_RND

MPLS_RND, VID_RND, SVID_RND

QUEUE_MAP_RND # queue map random

QUEUE_MAP_CPU # queue map mirrors

smp_processor_id()

pgset "udp_src_min 9"   set UDP source port min, If < udp_src_max, then cycle through the port range.

pgset "udp_src_max 9"   set UDP source port max.

pgset "udp_dst_min 9"   set UDP destination port min, If < udp_dst_max, then cycle through the port range.

pgset "udp_dst_max 9"   set UDP destination port max.

pgset "mpls 0001000a,0002000a,0000000a" set MPLS labels (in this example outer label=16,middle label=32,inner label=0 (IPv4 NULL)) Note that there must be no spaces between the arguments. Leading zeros are required.Do not set the bottom of stack bit,that's done automatically. If you do set the bottom of stack bit, that indicates that you want to randomly generate that address and the flag MPLS_RND will be turned on. You can have any mix of random and fixed labels in the label stack.

pgset "mpls 0" turn off mpls (or any invalid argument works too!)

pgset "vlan_id 77"    set VLAN ID 0-4095

pgset "vlan_p 3"     set priority bit 0-7 (default 0)

pgset "vlan_cfi 0"    set canonical format identifier 0-1 (default 0)

pgset "svlan_id 22"   set SVLAN ID 0-4095

pgset "svlan_p 3"    set priority bit 0-7 (default 0)

pgset "svlan_cfi 0"   set canonical format identifier 0-1 (default 0)

pgset "vlan_id 9999"   > 4095 remove vlan and svlan tags

pgset "svlan 9999"    > 4095 remove svlan tag

pgset "tos XX"      set former IPv4 TOS field (e.g. "tos 28" for AF11 no ECN, default 00)

pgset "traffic_class XX" set former IPv6 TRAFFIC CLASS (e.g. "traffic_class B8" for EF no ECN, default 00)pgset stop aborts injection. Also, ^C aborts generator.

pgset "rate 300M"     set rate to 300 Mb/s

pgset "ratep 1000000"   set rate to 1Mpps

线速定义

linux内核发包工具,Linux内核发包工具pktgen测试方案说明相关推荐

  1. linux内核丢包分析工具,Linux模拟网络丢包与延迟的方法

    netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块.该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽.传输延迟.丢包等等 ...

  2. linux发包密码,linux下网络发包工具(cp过来的)

    第1章.     说明 本文档只适用于Tcpreplay3.x. 第2章.     Tcpreplay系列工具 2.1. 概述 首先推荐一个网站:http://tcpreplay.synfin.net ...

  3. linux补丁怎么下载工具,Linux内核补丁批量自动下载工具

    Linux kernel官网cgit工具不支持按变更代码进行补丁搜索,想到个办法就是把补丁都抓下来,这样可以在本地搜索.花了2个小时写了个小工具,话不多说,直接看效果: E:\docs\TOOLS\p ...

  4. 嵌入式Linux设备驱动程序:编写内核设备驱动程序

    嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...

  5. Linux漏洞建议工具Linux Exploit Suggester

     Linux漏洞建议工具Linux Exploit Suggester 在Linux系统渗透测试中,通常使用Nessus.OpenVAS对目标主机进行扫描,获取目标主机可能存在的漏洞.如果无法进行漏洞 ...

  6. 13 种在 Linux 系统上检测 CPU 信息的工具

    13 种在 Linux 系统上检测 CPU 信息的工具 问题: 我想要了解我的电脑关于CPU处理器的详细信息,查看CPU信息比较有效地方法是什么? 根据你的需要,有各种各样的关于你的CPU处理器信息你 ...

  7. linux运维实战练习及linux shell脚本、awk、sed工具命令学习总结

    一.linux shell 脚本 1.描述shell程序的运行原理(可附带必要的图形说明): Linux系统的shell作为操纵系统的外壳,为用户提供使用操纵系统的接口.它是命令语言.命令解释程序及程 ...

  8. 监控 Linux 性能的 18 个命令行工具

    对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并运行是多么的不容易.基于此原因,我们 ...

  9. linux内核网络协议栈--linux bridge(十九)

    1 . 前言 本文是参考附录上的资料整理而成,以帮助读者更好的理解kernel中brdige 模块代码. 2. 网桥的原理 2.1 桥接的概念 简单来说,桥接就是把一台机器上的若干个网络接口" ...

最新文章

  1. ssd_detected.cpp代码 head.h代码
  2. java去除字符串的空格,换行符,水平制表符,回车
  3. NgRx store.dispatch方法的单步调试
  4. 基于Vitual Box建立虚拟机,虚拟机系统为Linux Ubuntu16.04
  5. Python获取当前目录
  6. 【一套代码小程序NativeWeb阶段总结篇】可以这样阅读Vue源码
  7. yum仓库中源的配置与使用
  8. MATLAB学习笔记(1):MATLAB简介
  9. java编程比赛_[阶段一]java基础编程比赛
  10. 圆排列公式推导_数学广角早在公元三世纪,我国数学家刘徽为推导圆的面积公式而发明了 爱问知识人...
  11. 对一个浮点数保留两位小数
  12. 军犬信息采编发系统vs网络神采
  13. java 域账户登录失败_域用户登陆,错误:无法登录到你的账户,通常可以通过从你的账户注销,然后重新登录来解决此问题...
  14. 爱存在用计算机怎么弹,qiukepingvf
  15. 卖主机的建辉互联张磊道貌岸然骗子公司(www.zzidc.top)
  16. 【米哈游】2022春季校园招聘
  17. opencv产生随机数
  18. 最近知识的总结与复习
  19. 用Hook解决在VC++与C++Builder方面界面设计的一些问题
  20. SuperMap iClient for OpenLayers图层组控制实现方法

热门文章

  1. windows调试工具集
  2. 桂林理工大学计算机研究调剂,2018年桂林理工大学考研调剂信息
  3. hibernate系列之二
  4. linux终端自动输入,linux shell自动输入实现
  5. 人工智能切入垂直领域 风口已至?
  6. Centos7下python3安装pip-9.0.1
  7. oracle一些基本命令
  8. 十二、十三天总结笔记
  9. 中国电信广东公司面试经验
  10. delphi设计模式 多语言开发