有 Supermicro X10DAi 主板,手册是这里。在第 1-11 页上,您可以看到每个 CPU 都有自己的 RAM。
假设program A
通过本地套接字提供 API /var/run/socketapi
。该程序在 CPU 1 上启动。
然后连接program B
到该套接字并在 CPU 2 上启动。
当program B
向套接字写入命令时,内核通常会将数据从 的内存空间复制program B
到 的内存空间program A
。
但由于程序运行在不同的CPU上,并且CPU之间不共享内存,因此存在问题。
在最近的Linux下这个问题是如何解决的?也许CPU 1的整个内存都是使用手册中所示的QPI接口映射到CPU 2的内存?
或者IPC程序可能无法运行并出现错误?
请提供一些Linux源代码或文档的参考。
答案1
是的,CPU 通过 CPU 互连来映射彼此的内存。
在 Intel 兼容架构上,这是相干映射,因此软件在访问连接到另一个 CPU 的内存时主要以较高延迟的形式注意到。
由于系统内存本身有相当多的延迟,因此差异并不是很大。操作系统仍然会动态优化,并且可能决定将两个具有大量 IPC 流量的进程移动到同一节点上。
不同的体系结构也可能具有不连贯的映射,这要求软件更明确地了解内存局部性,但可以通过更多套接字更好地扩展。