6

sched_setaffinity()可以使用call将进程固定到一组特定的 CPU 内核。手册页说:

   Restricting a process to run on a single CPU also avoids the
   performance cost caused by the cache invalidation that occurs when a process
   ceases to execute on one CPU and then recommences execution on a different
   CPU.

这几乎是显而易见的事情(或不是?)。对我来说不是那么明显的是 -

将 LWP 固定到特定 CPU 或 SMP 节点是否会减少缓存一致性总线流量?例如,由于一个进程正在运行,因此其他 CPU 不应修改其私有内存,因此只有属于同一 SMP 节点的 CPU 应保持缓存一致。

4

2 回答 2

10

对于您描述的固定进程案例,应该没有 CPU 套接字到套接字的一致性流量。现代 Xeon 平台在芯片组中实现了监听过滤。snoop 过滤器指示远程套接字何时不能有问题的缓存行,从而避免向该套接字发送缓存无效消息的需要。

你可以自己测量这个。至强处理器实现了大量的缓存统计计数器。您可以使用 rdpmc 指令在您自己的代码中读取计数器,或者只使用 VTune 之类的产品。仅供参考,使用 rdpmc 非常精确,但有点棘手,因为您必须最初在 CR4 中设置一个位以允许在用户模式下使用此指令。

- 编辑 -

我上面的回答对于使用 QPI 链接的 55xx 系列 CPU 来说已经过时了。这些链接直接互连 CPU 插槽,无需中间芯片组,如: http ://ark.intel.com/products/37111/Intel-Xeon-Processor-X5570-%288M-Cache-2_93-GHz-6_40-GTs-Intel -QPI%29

但是,由于每个 CPU 中的 L3 高速缓存都包含在内,因此仅当本地 L3 高速缓存指示线路不在本地套接字中时才会发生对 QPI 链接的窥探。同样,假设线路也不存在,远程套接字的 L3 可以快速响应交叉窥探而不会打扰内核。

因此,包容性 L3 缓存应该最大限度地减少套接字间的一致性开销,这不是由于您的情况下的芯片组侦听过滤器。

于 2012-02-27T15:27:09.737 回答
7

如果您在 NUMA 系统(如 Opteron 服务器或 Itanium)上运行,这是有道理的,但您必须确保将进程绑定到它分配内存的同一个 NUMA 节点。否则,这是一种反优化。应该注意的是,任何支持 NUMA 的操作系统无论如何都会尝试将执行和内存保持在同一个节点上,如果你根本不告诉它任何东西,尽其所能(一些旧版本的 Windows 相当差但我不希望最近的 Linux 会出现这种情况)。

如果您不在 NUMA 系统上运行,那么将进程绑定到特定内核是您可以做的最愚蠢的事情。操作系统不会为了好玩而让进程在 CPU 之间跳动,如果一个进程必须移动到另一个 CPU,那并不理想,但世界也不会结束。它很少发生,当它发生时,你几乎无法分辨。
另一方面,如果进程绑定到一个 CPU 并且另一个 CPU 处于空闲状态,则操作系统无法使用它……也就是说 100% 的可用处理能力付诸东流。

于 2012-02-27T14:22:15.787 回答