如何为前 4 个内核设置所有系统 IRQ



服务器:我有 2 个英特尔 10 核 CPU 或 8 核的服务器。所以有些有 40 个内核,有些有 32 个内核(启用英特尔 HT)

背景:我正在运行我们的应用程序,它将隔离CPU,目前,我隔离该应用程序的最后32个内核(核心8-39)。 4 核(核心 4-7)用于其他用途(通常,它将使用 50% 的系统 CPU)。 我想为系统 IRQ 使用分配核心 0-3。由于目前,如果我运行应用程序,系统响应非常慢,我认为一些 IRQ 请求已与 Core 4-7 存在争议,导致响应低。 您认为如果可能的话,只需使用 4 个内核来处理系统 IRQ 即可吗?

如果您有多个套接字("石头"),则表示您有 NUMA 系统。 这是获取更多信息的链接 https://en.wikipedia.org/wiki/Non-uniform_memory_access

尝试在同一插槽上使用 CPU。下面我将解释为什么以及如何做到这一点

  1. 确定每个插槽上的确切 CPU ID 。

    % numactl --hardware available: 2 nodes (0-1) node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 node 0 size: 24565 MB node 0 free: 2069 MB node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 node 1 size: 24575 MB node 1 free: 1806 MB node distances: node 0 1 0: 10 20 1: 20 10

这里的"节点"的意思是"插座"(石头)。因此,0,2,4,6 个 CPU 位于同一节点上。 将所有 IRQ 移动到一个节点以将 L3 缓存用于一组 CPU 是有意义的。

  1. 隔离除 0,2,4,6 之外的所有 CPU。

需要添加参数才能启动 Linux 内核 isolcpus= cpu_number [, cpu_number ,...]

例如

isolcpus=1,3,5,7-31
  1. 控制哪些 IRQ 在哪些 CPU 上运行

cat/proc/interrupts

  1. 使用 numactl 命令启动应用程序以与 CPU 和内存对齐。 (这里需要了解什么是 NUMA 和对齐。请点击文章开头的链接)

numactl [--membind=nodes] [--cpunodebind=nodes]

  1. 你的问题比我在这里提到的要大得多。

如果看到系统运行缓慢,需要了解瓶颈。 尝试使用top,vmstat,iostat收集原始信息,以找出弱点。

提供您系统的一些统计数据,我将帮助您正确打开它。