我的服务器有24个CPU核心,96G内存,安装了CentOS 7.2 x86_64。
启动我的程序后大的数据集,我的程序将使用大约 50G 内存,并且 Linux 系统将显示较高的系统中断率,但上下文切换率将较低。dstat
将显示在 500k int/s 和 1000k int/s 之间。CPU 使用率将接近 100%,大约 40% us,60% sy。
如果数据集较小,程序将使用大约 5G 内存,并且一切都会很好,CPU 使用率 100%,大约 99%us,1%sy。这是预期的。
该程序是我自己写的,是一个多线程程序。它不执行任何网络 IO,很少执行磁盘 IO,主要是内存操作和算术。无论数据集大小如何,线程模型和算法都是相同的。
我的问题是,如何才能准确找出我的程序最常使用哪些中断(并且尽可能摆脱它们以提高性能)?
答案1
我假设您没有配备 24C CPU 的单插槽系统。因此它可能是配备 2x12C 的 NUMA 系统。在这种情况下,我建议确保程序仅使用一个 numa 节点(通常是插槽)及其本地一半的 RAM。
当你使用了50G的时候,这意味着numa局部性无法得到保证,因为它超过了内存的一半。
要检查实际状态,请使用 numastat。如果您使用的是 RHEL,则可以使用 numad 自动处理内存局部性。或者您可以使用numactl --hardware
它将为您提供有关 HW NUMA 节点的概述。这里有一个非常好的带有示例的操作方法:
http://fibrevillage.com/sysadmin/534-numactl-installation-and-examples
这样,您就可以在所需的 CPU 上锁定您的程序。
我建议检查您是否正在运行 irqbalance 守护程序,否则您可能有一个核心因中断而过载。
答案2
在 Linux 上:watch cat /proc/interrupts
将显示每个中断和 CPU 的中断调用数量。我猜你会看到 LOC(本地计时器)和 RES(重新调度)。