Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将进程固定到CPU核心或SMP节点是否有助于减少缓存一致性流量?_Linux_Performance_Cpu_Cpu Architecture_Cpu Cache - Fatal编程技术网

Linux 将进程固定到CPU核心或SMP节点是否有助于减少缓存一致性流量?

Linux 将进程固定到CPU核心或SMP节点是否有助于减少缓存一致性流量?,linux,performance,cpu,cpu-architecture,cpu-cache,Linux,Performance,Cpu,Cpu Architecture,Cpu Cache,可以使用调用将进程固定到一组特定的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 differen

可以使用调用将进程固定到一组特定的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应保持缓存一致性。

如果在NUMA系统(如Opteron服务器或安腾)上运行,这是有意义的,但必须确保将进程绑定到它分配内存的同一NUMA节点。否则,这是一种反优化。需要注意的是,任何支持NUMA的操作系统都会尽其所能地将执行和内存保持在同一个节点上,如果你什么都不告诉它的话(一些旧版本的Windows在这方面做得很差,但我不认为最近的Linux会是这样)

如果您不在NUMA系统上运行,那么将进程绑定到特定的核心是您能做的最愚蠢的事情。操作系统不会为了好玩而让进程在CPU之间跳转,如果一个进程必须移动到另一个CPU,那么这并不理想,但世界也不会结束。这种情况很少发生,当它发生时,你很难分辨。

另一方面,如果进程绑定到一个CPU,而另一个CPU空闲,则操作系统无法使用它。。。这是100%的可用处理能力消耗殆尽。

对于您描述的固定进程情况,应该没有CPU套接字到套接字的一致性通信。现代Xeon平台在芯片组中实现snoop过滤。snoop筛选器指示远程套接字何时不能具有有问题的缓存线,从而避免向该套接字发送缓存失效消息

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

--编辑--

我上面的答案对于使用QPI链接的55xx系列CPU来说已经过时了。这些链路直接互连CPU插槽,无需插入芯片组,如:

但是,由于每个CPU中的三级缓存都是包含的,因此只有当本地三级缓存指示线路不在本地套接字中时,才会对QPI链路进行窥探。同样,远程插座的L3可以快速响应交叉监听,而不会干扰核心,前提是线路也不存在


因此,包容性的L3缓存应该最大限度地减少套接字间的一致性开销,这不是因为在您的情况下使用了芯片组嗅探过滤器。

我使用的是Xeon X5570,这有点NUMA。假设我每个CPU有4个内核和4个CPU。问题是-如果我运行4个线程不断地使用内存围栏进行一些繁忙的等待,但这些LWP固定在同一CPU的4个内核上,那么缓存失效请求是否会发送到其他CPU?如果是这样,谁能保证其他CPU在理论上不能修改相同的内存,从而可以应用这种优化?我知道有些人会用DMA和设备驱动程序来实现这一点,但是用户空间Linux应用程序呢?对于同一CPU上的4个内核,我不明白为什么这会是一个问题(L2在Xeon 5xxx上共享,CPU会尽其所能保持L1同步,我从来没有注意到任何问题)。对于其他3个CPU之一上的内核,正如srking所指出的,有一个snoop过滤器。通常情况下,您不想一直忙着等待(这没有什么意义),因此性能问题在这两种情况下都不太重要。当然,这在很大程度上取决于您的应用程序,但当一个忙着等待时,通常是在较长的任务之间等待很短的时间,因此通常不会有太多争用,即使有16条线。因此,您可能看到的任何缓存一致性效果,即使是假设的,也不会有太大的影响。如果他们这样做了,你肯定真的把大部分时间都花在旋转上了,然后从一开始就出了问题。@Damon,普通操作系统中的负载平衡行为并不那么好。它们确实倾向于在CPU之间不必要地跳转进程。