cpu-architecture - 本地 CPU 可能会降低远程 CPU 的数据包接收性能

标签 cpu-architecture numa high-speed-computing

我有一台配备 2 个 Intel Xeon CPU E5-2620 (Sandy Bridge) 和 10Gbps 82599 NIC(2 个端口)的服务器,用于高性能计算。从 PCI 关联性中,我看到 10G 网卡连接到 CPU1。我启动了几个数据包接收线程来进行实验,线程接收数据包,进行IP/UDP解析,并复制到缓冲区中。我用于10G网卡的驱动是IOEngine PacketShader/Packet-IO-Engine · GitHub

第一季度!空闲的CPU1会降低CPU0的数据包接收性能

1.1) 如果1个或2个或4个线程绑定(bind)到CPU0,所有线程的总体性能约为2.6-3.2Gbps 1.2) 如果2个线程绑定(bind)到CPU1,总体性能为16.XGbps 1.3) 如果 CPU1 绑定(bind) 4 个线程,则总体性能为 19.XGbps(2 * 10G 端口上的最大值)

由于CPU0没有直接与网卡相连,所以CPU0上的最大接收速度似乎是2.6-3.2Gbps。但是我发现,如果某些计算密集型进程在 CPU1 上运行,则 CPU0 上的数据包接收线程在 2 个线程时提升至 15.XGbps,在 4 个线程时提升至 19.XGbps。

这是由于电源管理吗?如果CPU1空闲,它会运行在省电模式吗?即使是这样,CPU1 如何影响 CPU0 的性能呢?关于 QPI 还有什么我不知道的吗?

第二季度! CPU1 过载会降低所有数据包接收性能

2.1) 如果CPU0上运行1个包接收线程,CPU1上运行1个包接收线程,则总体性能为10Gbps。每个线程的性能几乎相同——5.X Gbps。 2.2) 如果CPU0上运行2个数据包接收线程,CPU1上运行2个数据包接收线程,则总体性能为13Gbps。而且每个线程的性能几乎相同 -- 3.X Gbps,低于 2.1、1.2 和 1.3

简而言之,当接收同时运行在CPU0和CPU1上的线程时,所有线程都无法达到其最大性能,并且它们的性能几乎相同。

我认为我对 NUMA 和 QPI 有很多不了解,有人可以帮我解释一下吗?谢谢

最佳答案

Q1:是的,这听起来可能是由于电源管理造成的。 QPI 具有低功耗状态,并且 PCIe 插槽直接悬卡在每个处理器插槽、CPU 内核和整个处理器上。详细信息在这里:https://software.intel.com/en-us/articles/power-management-states-p-states-c-states-and-package-c-states

如果您有权访问 BIOS,请尝试禁用 QPI L 状态、PEG PCIe L 状态和 CPU C 状态。如果问题解决了,您可以取消其中一些设置,以确定哪些设置对性能下降负有最大责任。

第二季度:英特尔提供 some details关于 PCIe 的排序规则和流量控制可能相关,但除了知道它们存在并可能限制性能之外,很难对它们做出太多回应。任一套接字的非核心中可能存在未公开记录的类似约束。如果是其中任何一种情况,您可能可以使用 VTune 进一步挖掘并查看哪些资源正在耗尽。

NIC 驱动程序中使用的同步方案也可能存在性能问题。 VTune“并发”和“锁定和等待”分析类型可以帮助识别和指导修复这些问题。

关于cpu-architecture - 本地 CPU 可能会降低远程 CPU 的数据包接收性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18008567/

相关文章:

linux - 什么是真正的 pte(与 NUMA 中的迁移 pte 相对)

c - 通过延迟/性能测量确定 NUMA 布局

multithreading - 切换到并行编码

cpu - CPU如何知道RAM中的地址是否包含整数,预定义的CPU指令或任何其他类型的数据?

assembly - 为什么 lw 指令的第二个参数同时采用偏移量和 regSource?

Android 模拟器 ABI

c++ - 在 L3 缓存未命中发生之前, vector 中有多少个可迭代对象?

linux - 如何在用户模式 ​​NUMA 感知内存分配器中实现交错页面分配?