有 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 源代码或文档的参考。
是的,CPU 通过 CPU 互连映射彼此的内存。
在 Intel 兼容架构上,这是一个一致的映射,因此在访问连接到另一个 CPU 的内存时,软件主要以更高延迟的形式注意到。
由于系统内存本身有相当多的延迟,因此差异不是很大。操作系统仍在运行中进行优化,并可能决定将具有大量 IPC 流量的两个进程移动到同一节点上。
不同的体系结构也可能具有非一致性映射,这需要软件更明确地了解内存位置,但随着更多套接字的扩展更好。