如何在 Ubuntu 16.04 LTS 上设置 Intel SSD NVME irq Affinity?

如何在 Ubuntu 16.04 LTS 上设置 Intel SSD NVME irq Affinity?

感谢您阅读这个问题(我到处寻找现有的答案但没有成功......)问题在标题中,但这里有更多详细信息:

这是我的设置:

  • 我正在使用英特尔的 S2600WT 服务器,该服务器有两个 CPU(Xeon v4,每个 CPU 有 24 个内核),运行 Ubuntu 16.04 LTS。
  • 核心 [00..23] 属于 CPU#1
  • 核心 [24..47] 属于 CPU#2
  • 我有 2 个英特尔固态硬盘:DC3700 连接到 CPU#1 的 PCIe(每个都通过 NVME 连接到 PCIe x4-gen3)
  • 我在 CPU#1(PCIe x8-gen2)的另一个 PCIe 插槽上有一个采集板(Innovative X6-1000M)

我们尝试运行我们公司的采集软件,该软件从采集板捕获数据并将其写入 SSD。

  1. 当我只有一个 CPU 时,程序按预期运行,我们能够以高达 2.4GB/s 的速度进行捕获
  2. 当我有两个 CPU 时,我们遇到了软件死锁,程序冻结了。当我使用调试器时,我可以看到程序在尝试写入 SSD 时冻结了。

因此,我会尝试使用两个 CPU,但只在 CPU#1 上启动软件,并将所有中断直接路由到 CPU#1

为此,我将文件写入/proc/irq/defaut_smp_affinty0000,00000004这对采集板有效,我可以看到所有中断都直接转发到核心#2(在CPU#1上)

但是,我发现我的 NVMe 的中断仍然分派在所有核心上,并且也分派在 CPU#2(核心 24..47)的核心上。

我尝试过这样做:

cat /proc/interrupts | grep -i nvme

查看属于NVMe SSD的中断号,然后手动修改文件(irq [157至186])

sudo -i echo 0000,00000004 > /proc/irq/186/smp_affinity
permission denied

我也尝试过:

sudo sh -c "echo 0000,00000004 > /proc/irq/186/smp_affinity"
sh: echo I/O error

sudo sh -c "echo 1,3 > /proc/irq/186/smp_affinity_list"
sh: echo I/O error

我无法修改这些文件。

我也尝试irqbalance通过这种方式重新启动该服务:

export IRQBALANCE_BANNED_CPUS=ffff,fffffff0
sudo service irqbalance stop
sudo irqbalance --debug

我还尝试numactl在 CPU#1 CORE#2 上启动该程序

但到目前为止,什么都没起作用,我发现 CPU#2 仍然接收到一些 NVMe 中断。您知道我如何才能将 NVMe 中断仅分派给 CPU#1,并将 CPU#2 从我的软件中完全排除吗?

非常感谢您的回答,我希望我已经足够明确地帮助您了:)否则,只需询问更多详细信息。

编辑1:我通过使用以下命令禁用 CPU#2 的所有核心,设法使我的软件正常运行:

for i in {24..47} do; sudo sh -c "echo 0 > /sys/devices/cpu/cpu$i/online"

问题是,这样做只会停用 CPU#2 的所有核心,并将计算能力降低两倍。但这给了我更多线索,表明仅在一个 CPU 上运行该软件才有效。

相关内容