一: 多队列及中断信息收集

[root@T185 ~]# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:
RX Mini:
RX Jumbo:
TX:
Current hardware settings:
RX:
RX Mini:
RX Jumbo:
TX:
[root@T185 ~]# ls /sys/class/net/eth0/queues/
rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx-
rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx-
[root@T185 ~]# cat /proc/interrupts |less -S
[root@T185 ~]# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15 CPU16 CPU17 CPU18 CPU19 CPU20 CPU21 CPU22 CPU23
: IR-IO-APIC-edge timer
: IR-IO-APIC-edge i8042
: IR-IO-APIC-edge rtc0
: IR-IO-APIC-fasteoi acpi
: IR-IO-APIC-edge i8042
: IR-IO-APIC-fasteoi ehci_hcd:usb1
: IR-IO-APIC-fasteoi ehci_hcd:usb2
: DMAR_MSI-edge dmar0
: DMAR_MSI-edge dmar1
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge aerdrv
: IR-PCI-MSI-edge ahci
: IR-PCI-MSI-edge isci-msix
: IR-PCI-MSI-edge isci-msix
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0-TxRx-
: IR-PCI-MSI-edge eth0
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1-TxRx-
: IR-PCI-MSI-edge eth1
: IR-PCI-MSI-edge eth3
NMI: Non-maskable interrupts
LOC: Local timer interrupts
SPU: Spurious interrupts
PMI: Performance monitoring interrupts
IWI: IRQ work interrupts
RTR: APIC ICR read retries
RES: Rescheduling interrupts
CAL: Function call interrupts
TLB: TLB shootdowns
TRM: Thermal event interrupts
THR: Threshold APIC interrupts
MCE: Machine check exceptions
MCP: Machine check polls
ERR:
MIS:
[root@T185 ~]#

interrupts

二: 设置CPU隔离

在grub.conf 中,增加isolcpus参数。

三: 修改收发包队列数

[root@T185 tong]# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:
RX Mini:
RX Jumbo:
TX:
Current hardware settings:
RX:
RX Mini:
RX Jumbo:
TX: [root@T185 tong]# ethtool -G eth0 rx tx
[root@T185 tong]# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:
RX Mini:
RX Jumbo:
TX:
Current hardware settings:
RX:
RX Mini:
RX Jumbo:
TX:

ethtool

不能设成1, 最小64.所以,对于中断并没有什么影响.这好像不对,不知道这是什么鬼。

下载最新的驱动,https://downloadcenter.intel.com/download/14687 并查看README

Command Line Parameters
-----------------------
If the driver is built as a module, the following optional parameters are used
by entering them on the command line with the modprobe command using this
syntax:
modprobe ixgbe [<option>=<VAL1>,<VAL2>,...] There needs to be a <VAL#> for each network port in the system supported by
this driver. The values will be applied to each instance, in function order.
For example:
modprobe ixgbe InterruptThrottleRate=, 。。。 。。。 Multiqueue
----------
Valid Range:
,
= Disables Multiple Queue support
= Enabled Multiple Queue support (a prerequisite for RSS)

README

README里给的参数竟然不对,尼玛

[root@T185 tong]# modprobe -r ixgbe
[root@T185 tong]# modprobe ixgbe MQ=,
[root@T185 tong]# ls /sys/class/net/eth0/queues/
rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx-
rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- rx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx- tx-
[root@T185 tong]# ls /sys/class/net/eth1/queues/
rx- tx-
[root@T185 tong]#

四:中断绑定:

cpu结构:

[root@T185 tong]# ./cpu_layout.py
============================================================
Core and Socket Information (as reported by '/proc/cpuinfo')
============================================================ cores = [, , , , , ]
sockets = [, ] Socket Socket
-------- --------
Core [, ] [, ]
Core [, ] [, ]
Core [, ] [, ]
Core [, ] [, ]
Core [, ] [, ]
Core [, ] [, ]
[root@T185 tong]#

另外两个工具:lstopo,和hwloc。

中断绑定:

#! /bin/bash

function bind() # $lcpus, $irq_list, $set
{
for i in $
do
echo -n $i ": "
if [ $ -eq ]
then
echo $ > /proc/irq/$i/smp_affinity_list
echo "Done!"
else
cat /proc/irq/$i/smp_affinity_list
fi
done
} function usage()
{
echo "Usage:"
echo -e "\tirq_bind.sh 0(print)/1(set) "
echo
} if [ $# -ne ]
then
usage
exit
fi if [ \( "$1" != "" \) -a \( "$1" != "" \) ]
then
usage
exit
fi irq_list=`cat /proc/interrupts |grep eth0 |awk -F: '{print $1}'`
bind "1,13" "$irq_list" $ irq_list=`cat /proc/interrupts |grep eth1 |awk -F: '{print $1}'`
bind "2,14" "$irq_list" $

注意: 网卡驱动重新加载过了之后,需要重新对中断进行绑定。

五: 发包:

tcpreplay -i eth0 -l0 -L10000000 -p400000 -K syy/.pcap 

六: pktgen-dpdk

http://pktgen-dpdk.readthedocs.io/en/latest/

版本太多,版本间的修改又都比较大。最后pktgen和dpdk都用了当前的最新版本。重要编译通过了,且运行正常了。

tong@zw:~/src$ ls
dpdk-17.05 dpdk-17.05.tar.gz pktgen-3.3. pktgen-3.3..tar.gz

6.1  正常编译dpdk,并正确设置环境变量

make config T=x86_64-native-linuxapp-gcc O=x86_64-native-linuxapp-gcc
make
tong@zw:~/src$ tail -n2 ~/.bashrc
export RTE_SDK=~/src/dpdk-17.05/
export RTE_TARGET=x86_64-native-linuxapp-gcc

6.2   编译并设置 pktgen

make
sysctl -n vm.nr_hugepages=
vim cfg/default.cfg ./tools/run.py -s
hugepages per socket
Set /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages to
Bind devices to DPDK:
['03:00.3']
sudo mount -t hugetlbfs nodev /mnt/huge

6.3  运行

http://pktgen-dpdk.readthedocs.io/en/latest/usage_pktgen.html#usage-pktgen

最终配置如下:

tong@zw:~/src/pktgen-3.3.$ cat cfg/default.cfg
# Setup configuration
setup = {
'devices': [
'03:00.3'
], 'opts': [
'-b igb_uio'
]
} # Run command and options
run = {
'dpdk': [
'-l 4,5',
'-n 1',
'--proc-type auto',
'--log-level 7',
'--file-prefix pg'
], 'blacklist': [
], 'pktgen': [
'-T',
'-P',
'--crc-strip',
'-m [5].0',
], 'misc': [
'-f themes/black-yellow.theme'
]
}
tong@zw:~/src/pktgen-3.3.$

cfg/default.cfg

tong@zw:~/src/pktgen-3.3.$ ./tools/run.py cfg/default.cfg

6.4  使用

Pktgen:/> set  count
Pktgen:/> set size
Pktgen:/> start
Pktgen:/> set size
Pktgen:/> start
Pktgen:/> set size
Pktgen:/> start
Pktgen:/>

发了三次,每次五个包,长度分别为 64 / 512 / 70

详细的参数参考:http://pktgen-dpdk.readthedocs.io/en/latest/commands.html#runtime-options-and-commands

也可以在Pktgen的命令行里 help

还可以用LUA进行配置,但是我不会 http://pktgen-dpdk.readthedocs.io/en/latest/lua.html

6.5  其他

但是所有的 TCP包都是SYN的,不能握手。与我的测试目的还是有些区别。

6.6   发送pcap

  在命令行使用 -s P:PCAP_file 参数。

  在pktgen中使用如下命令:

Pktgen:/> enable  pcap

  使用page pcap命令可以查看pcap详细内容:

Pktgen:/> page pcap

  之后使用正常的命令,便可以发送数据包了。

七。 pktgen-linux

据说之支持 UDP,不支持TCP。

八。测试数据

[development][dpdk][pktgen] 网卡收发包性能测试-详细数据

九。 使用gprof查找性能瓶颈。

  9.1  使用gcc -pg编译

  9.2  正常运行程序,并正常退出,系统会生成一个gmon.out文件。

  9.3  使用如下命令查看输出

    gprof app_name gmon.out

  9.4  通过观察日志,找到性能瓶颈,是一个链表遍历查找的函数。

[development][dpdk][pktgen] 网卡收发包性能测试的更多相关文章

  1. [development][dpdk][pktgen] 网卡收发包性能测试-详细数据

    三层包测试 发包方式:192.168.20.205 发包工具:pktgen 发包网卡:i350 收包设备:1922.168.20.185 CPU:Intel(R) Xeon(R) CPU E5-262 ...

  2. DPDK收发包全景分析

    前言:DPDK收发包是基础核心模块,从网卡收到包到驱动把包拷贝到系统内存中,再到系统对这块数据包的内存管理,由于在处理过程中实现了零拷贝,数据包从接收到发送始终只有一份,对这个报文的管理在前面的mem ...

  3. dpdk网卡收包分析

    一个网络报文从网卡接收到被应用处理,中间主要需要经历两个阶段: 阶段一:网卡通过其DMA硬件将收到的报文写入到收包队列中(入队)阶段二:应用从收包队列中读取报文(出队)由于目前正在使用vpp/dpdk ...

  4. kernel笔记——网络收发包流程

    本文将介绍网络连接建立的过程.收发包流程,以及其中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 应用层 对于使用socket进行网络连接的服务器端程序,我们会先调用socket函数创建一个 ...

  5. 代码学习-Linux内核网卡收包过程(NAPI)【转】

    转自:https://blog.csdn.net/crazycoder8848/article/details/46333761 版权声明:本文没有任何版权限制,任何人可以以任何方式使用本文. htt ...

  6. UDP收发buffer尺寸对收发包流量的影响

    下午验证一个高流量发包问题时,发现了一个值得记录的问题:socket的收发buffer尺寸是会影响收发包的效率的,高流量通讯时,若socket的收发buffer尺寸过小会一定程度降低收发包效率. 自己 ...

  7. 交换芯片收发包的 DMA 实现原理

    交换芯片支持:报文.计数.表项3种DMA类型,其中报文DMA包括系统从芯片到接收报文或发送报文到交换芯片,计数DMA用来从片上获取统计计数,表项DMA功能分为SLAM DMA(系统内存DMA到片上交换 ...

  8. Intel X710网卡VxLAN offload 性能测试

    Intel X710网卡VxLAN offload性能测试 1.  测试环境参数: 交换机:盛科E580 服务器: Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz ...

  9. [development][dpdk][hugepage] 大页内存的挂载

    参考: [development][dpdk][hugepage] 为不同的结点分配不同大小的大页内存 完成了以上内容之后, 下一步需要做的是挂载, 大页内存只有被挂载了之后,才能被应用程序使用. 挂 ...

随机推荐

  1. [k8s]一些技巧性的yaml和dockerfile-docker学习思路

    我会把一些dockerfile和yaml的技巧性东西不定期搜集到这里 docker学习思路 三部曲: 1,vm会搭建服务 2,docker会跑服务 3,k8s集群会调度该服务 存储 vm1 vm2 共 ...

  2. Ramda函数式编程之PHP

    0x00 何为函数式编程 网上已经有好多详细的接受了,我认为比较重要的有: 函数是"第一等公民",即函数和其它数据类型一样处于平等地位 使用"表达式"(指一个单 ...

  3. redis竞汰数据同步问题解决

    Redis 面试的时候遇到过问Redis是如何解决“竞态条件”的,相关知识点总结一下. 乐观锁 所谓竞态条件,举个例子,一个代表点击数的数值hitcount,每个客户点击一次则+1. 没有事务的时候, ...

  4. ECSHOP后台编辑器不能上传中文名图片的解决办法

    在后台上传商品图片的时候,如果你选择一个中文名称的图片,那么上传后会产生乱码,导致图片显示不出来. 下面说一种解决办法: 使用“年月日时分秒 + 6个随机字符”做为文件名,如 201010161356 ...

  5. php框架之odp(一)

    熟悉odp框架的使用已经快一个月了,今天总结一下.odp和yii都是成熟的常用的php框架,因为odp是公司内部开发的,且公司内部用odp的较多,所以我就从odp框架入手.仅仅纪录自己的学习体会 一. ...

  6. python3 zip压缩文件压缩多个不同文件夹内的文件方法

    #!/usr/bin/env python # -*- coding:utf-8 -*- import zipfile def addzip(): f = zipfile.ZipFile('test. ...

  7. 多密钥ssh-key生成与管理

    由于 git 大文件用 http 方式难以传输,必须使用 ssh-key,而 ssh-key 又生成了好多个.最近在各种折腾 ssh,公钥私钥上花费了很多时间,现将一些问题总结如下.系统为 Mac/L ...

  8. linux 设置中文版man手册

    作为CentOS 新手,看懂英文man固然重要,不过配置好中文man也可以让自己更快速地学习!1. 下载中文man包源码的网址:https://src.fedoraproject.org/repo/p ...

  9. 10享元模式Flyweight

    一.什么是享元模式 Flyweight模式也叫享元模式,是构造型模式之 一,它通过与其他类似对象共享数据来减小内存 占用. 二.享元模式的结构 三.享元模式的角色和职责 抽象享元角色: 所有具体享元类 ...

  10. Use a load-balancer as a first row of defense against DDOS

    We’ve seen recently more and more DOS and DDOS attacks. Some of them were very big, requiring thousa ...