我正在testing两台工作站的networking性能,每台工作站都有2.4GHz Xeon四核处理器和NC550SFP PCIe双端口10GbE服务器适配器,并且背靠背连接。
我已经检查了内存的带宽,这是〜12Gbps,所以在这里没有瓶颈。 PCIe总线速度也可以。
我正在使用UDP的最小数据包大小来testing最大pps,结果与这些比较是可怜的:2012-lpc-networking-qdisc-fastabend.pdf(对不起,我只能发布一个链接)。 如果我增加数据包大小和MTU,我可以得到近线速度(约9.9Gbps)。
我使用pktgen与NST脚本,macvlan接口multithreading,我只得到〜1Mpps,所有四个核心在100%。
为了提高pktgen的TX性能,我偶然发现了这个文档: 在Linux Networking Stack中进行扩展
我已经检查,是的,我有mq qdiscs,应该产生最高的性能:
# ip link list | grep eth3 5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
我认为问题在于,只有一个TX队列被使用:
# dmesg | grep be2net [ 4.528058] be2net 0000:01:00.1: irq 47 for MSI/MSI-X [ 4.528066] be2net 0000:01:00.1: irq 48 for MSI/MSI-X [ 4.528073] be2net 0000:01:00.1: irq 49 for MSI/MSI-X [ 4.528079] be2net 0000:01:00.1: irq 50 for MSI/MSI-X [ 4.528104] be2net 0000:01:00.1: enabled 4 MSI-x vector(s) [ 4.696026] be2net 0000:01:00.1: created 4 RSS queue(s) and 1 default RX queue [ 4.761108] be2net 0000:01:00.1: created 1 TX queue(s)
我已经得到了关于如何在Linuxnetworking协议栈中启用Scaling中的多个TX队列的提示:
支持多队列的NIC的驱动程序通常提供内核模块参数或指定要configuration的硬件队列的数量。 例如,在bnx2x驱动程序中,该参数被称为num_queues。 如果设备支持足够的队列,则典型的RSSconfiguration将是每个CPU具有一个接收队列,否则对于每个存储器域至less一个接收队列,其中存储器域是共享特定存储器级别的一组CPU(L1,L2 ,NUMA节点等)。
我已经查看了Emulex的所有be2net驱动文档,甚至给他们发了一封电子邮件,没有运气。 我也浏览了内核源码。
我已经在Ubuntu 12.04上获得了最新的内核版本(3.10)和最新的网卡固件。
想法任何人?
谢谢!
我在红帽企业Linux机器上有类似的(?)挑战。 我读了同一篇文章,得出的结论是,我真正的问题是,使用每个可能的IRQ来让每个涉及networking包的CPU工作。 我将IRQ活动专注于可用内核的一个子集,然后相应地指导工作。 这里是rc.local文件:
# Reserve CPU0 as the default default IRQ handler for IRQ in `grep eth0 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done for IRQ in `grep eth1 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done for IRQ in `grep eth2 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done for IRQ in `grep eth4 /proc/interrupts | cut -d ':' -f 1`; do echo $(( (($IRQ & 1) + 1) << 2 )) > /proc/irq/$IRQ/smp_affinity; done
这里是cgrules.conf文件,它定义/区分我的apache web服务器远离10gbe,这样可以发生严重的networking吞吐量,因为它应该:
apache cpuset,cpu apache/
下面是cgconfig.conf文件,它实际上将服务器与其余的CPU活动分开:
mount { cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; cpuacct = /cgroup/cpuacct; memory = /cgroup/memory; devices = /cgroup/devices; freezer = /cgroup/freezer; net_cls = /cgroup/net_cls; blkio = /cgroup/blkio; } group apache { cpuset { cpuset.memory_spread_slab="0"; cpuset.memory_spread_page="0"; cpuset.memory_migrate="0"; cpuset.sched_relax_domain_level="-1"; cpuset.sched_load_balance="1"; cpuset.mem_hardwall="0"; cpuset.mem_exclusive="0"; cpuset.cpu_exclusive="0"; cpuset.mems="1"; cpuset.cpus="4-7,12-15"; } } group apache { cpu { cpu.rt_period_us="1000000"; cpu.rt_runtime_us="0"; cpu.cfs_period_us="100000"; cpu.cfs_quota_us="-1"; cpu.shares="1024"; } }
一个默认configuration(没有IRQ和cgroups黑客)我测量了大约5Gb / s的networking吞吐量。 随着IRQ集中和随机networkingIO移走,我使用netperf测量了线速(9.5Gb / s)的性能。
NB的巨型数据包没有什么区别,无论是之前还是之后的数字。