这个问题以前已经被问过,但我相信世界已经发生了足够的变化,值得再次提出。
在当今的系统上,我们拥有支持 NUMA 的 CPU,并且其核心之间共享内存,irqbalance 有什么用处吗?
运行irqbalance --oneshot --debug
表明现代 VMware ESXi 环境上的虚拟客户机正在核心之间共享 NUMA 节点。
# irqbalance --oneshot --debug 3
Package 0: numa_node is 0 cpu mask is 0000000f (load 0)
Cache domain 0: numa_node is 0 cpu mask is 0000000f (load 0)
CPU number 0 numa_node is 0 (load 0)
CPU number 1 numa_node is 0 (load 0)
CPU number 2 numa_node is 0 (load 0)
CPU number 3 numa_node is 0 (load 0)
在这种情况下,irqbalance 将检测到它正在 NUMA 系统上运行,然后退出。这会扰乱我们的进程监控。
我们应该研究跑步吗努马德而不是在这样的系统上使用 irqbalance 吗?
这对于 VMware 虚拟化服务器来说尤其有趣。
答案1
以下是 RedHat 的一位技术人员的回答。虽然我相信大多数企业硬件都支持 NUMA。而且据我所知,只要 CPU 配置合适,VMware 也会尝试将您的虚拟机安装在同一个 NUMA 节点上。
如能提供相关经验(尤其是有关 VMware 的经验),我将不胜感激。
这是因为现代服务器确实如此。请记住,多 CPU/多核与 NUMA 不同。许多多 CPU/核系统没有 NUMA。
在阅读下面的解释之前,请阅读上面的 IRQ Affinity 文档以及以下指南:
读完了这些吗?太好了,你不需要再听我说什么了!;-) 但万一你不耐烦了,下面就是你想要它们的原因...
IRQbalance 可防止所有 IRQ 请求都备份到单个 CPU 上。我见过许多具有 4 个以上 CPU 核心的系统运行缓慢,因为各个 CPU 上的所有进程都在等待 CPU 0 处理网络或存储 IRQ 请求。CPU 0 看起来非常非常繁忙,而所有其他 CPU 都不忙,但应用程序却非常慢。应用程序运行缓慢是因为它们正在等待来自 CPU 0 的 IO 请求。
IRQbalance 会尝试以智能方式在所有 CPU 之间平衡 IRQ,并在可能的情况下将 IRQ 处理尽可能靠近进程。这可能是同一个内核、共享同一缓存的同一芯片上的内核或同一 NUMA 区域中的内核。
您应该使用 irqbalance,除非:
您正在手动将您的应用程序/IRQ固定到特定核心,这是有充分理由的(低延迟、实时要求等)。
虚拟客户机。这实际上没有意义,因为除非您将客户机固定到特定的 CPU 和 IRQ 以及专用的网络/存储硬件,否则您可能看不到在裸机上的好处。但您的 KVM/RHEV 主机应该使用 irqbalance 和努马德和调整。
其他非常重要的调整工具是 tuned profile 和 numad。了解它们!使用它们!
Numad 与 irqbalance 类似,它会尝试确保进程及其内存位于同一个 numa 区域中。使用多核时,我们可以看到延迟显著减少,从而在负载下实现更加平稳可靠的性能。
如果您技术娴熟、勤奋且定期监控或工作量非常可预测,则可以通过手动将进程/IRQ 固定到 CPU 来获得更好的性能。即使在这些情况下,irqbalance 和 numad 也非常接近匹配。但如果您不确定或您的工作量不可预测,则应使用 irqbalance 和 numad。