我见过带有两个CPU插槽的服务器主板,我想知道这样的服务器是如何工作的。如果两个插槽必须通过主板上的某些接口相互通信以保持缓存一致性、锁定等,那么这不会显着增加内存延迟吗?或者,操作系统是否将进程限制在一个套接字上?我不知道这样的设置是如何工作的。我假设所有内存都是共享的?内存延迟可能会影响应用程序访问内存以提高性能的方式,这也是一个与编程相关的问题。任何相关信息都非常受欢迎。我只是出于好奇才问,因为我从来没有为这样的系统编写过代码,但也许有一天。
注意:我指的是具有两个 CPU 插槽和芯片的系统,而不仅仅是多核 CPU。假设多线程应用程序已正确编写,以避免单个多核 CPU 系统上的数据竞争。
是的,所有 RAM 在所有套接字上的所有内核之间共享,不同套接字上的线程之间的通信具有较高的延迟,并且原子和锁仍然按预期工作(如果存在争用,则延迟会更高)。
操作系统尝试将应用程序的所有线程都运行在单个套接字中以减少延迟,如果您没有使用很多线程,则无需担心它,并且无需更新代码它,CPU 芯片/插槽通常对正在运行的应用程序是透明的,并且有一些方法可以手动将应用程序限制到特定的内核或插槽,例如
numactl
。一些应用程序手动将线程固定到特定内核以提高性能,但此类应用程序很容易变得不可移植。
即使是内部有多个 CPU 芯片的较新的 AMD 芯片,由于延迟增加,也受益于 Linux 的内核更新,以提高性能,这就是为什么据说较新的 Linux 内核可以提高具有许多套接字/芯片的系统的性能。
最相关的来源和基准测试之一位于此视频中非统一内存架构 (NUMA):几乎深不可测的 Arcana 沼泽 - Fedor Pikus CppNow,主题演讲:
在 NUMA 系统上,当线程数超过单个节点中的 CPU 数量时,扩展性很差