我使用英特尔x520和x540双口NIC连接到戴尔PowerEdge服务器。所有NIC端口可以工作在10 Gbps,因此总共40 Gbps。该系统有2个插座,包含XeonE5-2640 v3处理器(Haswell微体系结构)。
我面临许多问题,可以通过PCIe和DMA基准测试来解决。然而,我找不到合适的方法去做同样的事情。即使使用基于DPDK的驱动程序和库( 64字节数据包),我也无法实现40 40Gbps的吞吐量。我需要进行64字节大小的实验,不能改变数据包大小。
我正在使用DPDK生成数据包,并使用Intel ./pcm-pci.x对事件进行计数。但是,计数是一种方式,从某种意义上说,我是在计算事件的数量,并且无法判断系统能够支持的每个事件的最大数量。来自pcm-pci.x的结果:
Skt PCIeRdCur RFO CRd DRd ItoM PRd WiL
0 73 M 3222 K 784 K 63 M 52 M 0 2791 K我的NIC连接到套接字0,这就是为什么我不把套接字1的结果。
有没有办法对PCIe总线和DMA引擎进行基准测试?是否有任何方法可以在IO子系统(每个级别)获得数据包处理的精确延迟(不能使用rdtsc()来度量危害级延迟)?
发布于 2017-11-11 08:35:39
您没有提到您的CPU内核是否以100%的利用率运行?如果它们以最大容量运行,而您没有获得40 40Gbps的线路速率,那么问题可能与软件有关。
查看一下SystemTap;您可以使用它来调试和记录内核事件和函数的运行时、延迟和抖动(创建一个周期图)。在这个博客文章中有一个很好的例子:https://blog.cloudflare.com/revenge-listening-sockets/
实际上,这并不是您所要求的,但是您可以使用它来帮助缩小测试中的瓶颈。您可以使用SystemTap来监视内核函数调用计数、执行时间(延迟)和抖动,在Linux下perf也非常有助于监视系统性能(上下文切换、分支丢失等,请参阅here和here),因此,这些都将帮助您缩小软件中的瓶颈。
这可能会导致一个与硬件直接交互的函数,如:main.c#L8000
^解释:
写将“长”写入内存映射的I/O地址。在这种情况下,地址是tx_ring->tail (这是一个硬件地址),要写入的值是i。这种对设备的写入会触发设备,让它知道额外的数据已经准备好从RAM中DMA并写入网络。
或者,这些工具可能会导致一个导致延迟的软件功能,例如,它可能有很高的现金命中率。
编辑
您也没有提到操作系统版本、内核版本、NIC驱动程序和固件版本等。在我使用DPDK的良好性能经验中,使用最新的NIC固件、驱动程序和最近的内核构建是非常重要的。
https://stackoverflow.com/questions/46109799
复制相似问题