感谢您阅读这个问题(我到处寻找现有的答案但没有成功......)问题在标题中,但这里有更多详细信息:
这是我的设置:
- 我正在使用英特尔的 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。
- 当我只有一个 CPU 时,程序按预期运行,我们能够以高达 2.4GB/s 的速度进行捕获
- 当我有两个 CPU 时,我们遇到了软件死锁,程序冻结了。当我使用调试器时,我可以看到程序在尝试写入 SSD 时冻结了。
因此,我会尝试使用两个 CPU,但只在 CPU#1 上启动软件,并将所有中断直接路由到 CPU#1。
为此,我将文件写入/proc/irq/defaut_smp_affinty
。0000,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 上运行该软件才有效。