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

Posted

技术标签:

【中文标题】本地 CPU 可能会降低接收数据包时的远程 CPU 性能【英文标题】:Local CPU may degrade Remote CPU performance on Packet Receiving 【发布时间】:2013-08-02 03:59:36 【问题描述】:

我有一台带有 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 个线程绑定到 CPU0,所有线程的综合性能约为 2.6-3.2Gbps 1.2)如果2个线程绑定到CPU1,综合性能16.XGbps 1.3)如果4个线程绑定到CPU1,综合性能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 有很多我不知道的地方,有人可以帮我解释一下吗?谢谢

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于本地 CPU 可能会降低接收数据包时的远程 CPU 性能的主要内容,如果未能解决你的问题,请参考以下文章

关于High CPU及基本排查

使用Hibernate进行数千次插入时的CPU利用率很高

用嗅探器探数据包时的工作原理 ?

降低 CPU 频率的 SIMD 指令

CPU风扇加油怎么操作?

Java怎么远程读取Linux的cpu使用率