上下文:
我正在编写一个包含多个进程的软件系统。它是在 Linux 下用 C++ 编写的。它们之间使用 Linux 共享内存进行通信。
通常,在软件开发中,性能优化是在最后阶段进行的。在这里,我遇到了一个大问题。该软件对性能要求很高,但在4核或8核的机器上(通常CPU不止一个),只能使用3核,因此前几台浪费了25%的CPU算力,后几台多了60%在第二个。 经过多次研究,并放弃了互斥锁和锁争用,我发现时间被浪费在 shmdt/shmat 调用上(分离和附加到共享内存段)。经过更多研究,我发现这些 CPU(通常是 AMD Opteron 和 Intel Xeon)使用称为 NUMA 的内存系统,这基本上意味着每个处理器都有其快速的“本地内存”,并且从其他 CPU 访问内存是昂贵的。
在做了一些测试之后,问题似乎是软件的设计使得基本上任何进程都可以将共享内存段传递给任何其他进程,以及它们中的任何线程。这似乎会降低性能,因为进程不断从其他进程访问内存。
问题:
现在的问题是,有没有办法强制成对的进程在同一个 CPU 中执行?我并不是要强制它们始终在同一个处理器中执行,因为我不关心它们在哪个处理器中执行,尽管那样就可以了。理想情况下,有一种方法可以告诉内核:如果你在一个处理器中调度这个进程,你也必须在同一个处理器中调度这个“兄弟”进程(它是通过共享内存与之通信的进程),这样表现不会受到惩罚。
最佳答案
我认为您可以从这些手册页开始:
$ apropos affinity
sched_getaffinity (2) - set and get a process's CPU affinity mask
sched_setaffinity (2) - set and get a process's CPU affinity mask
taskset (1) - retrieve or set a process's CPU affinity
$
取决于您是想从源代码还是从 shell 执行此操作。 pthread 库也有一些功能。
关于c - 如何强制两个进程在同一个CPU上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4664668/