如何强制两个进程在同一个CPU上运行?

语境:

我正在编写一个由多个进程组成的软件系统。 它在Linux下用C ++编程。 他们之间使用Linux共享内存进行通信。

通常情况下,在软件开发中,处于性能优化的最后阶段。 在这里,我遇到了一个大问题。 该软件对性能有很高的要求,但在有4个或8个CPU核心的机器上(通常有多个CPU),只能使用3个核心,从而浪费了25%的CPU功率,其次是60%。 经过多次研究,抛弃了互斥和锁争用,我发现时间被shmdt / shmat调用浪费了(分离并附加到共享内存段)。 经过更多的研究,我发现这些通常是AMD Opteron和Intel Xeon的CPU使用了一个名为NUMA的内存系统,这基本上意味着每个处理器都有其快速的“本地内存”,并且从其他CPU访问内存是昂贵。

做了一些testing之后,问题似乎就是这样devise软件,基本上,任何进程都可以将共享内存段传递给任何其他进程,并传递给其中的任何线程。 这似乎杀死了性能,因为进程不断地从其他进程访问内存。

题:

现在的问题是,有没有办法强制在同一个CPU中执行一对进程? 我并不是说要强迫他们总是在同一个处理器上执行,因为我不在乎他们是在哪一个执行的,尽pipe这样做会完成这个任务。 理想情况下,有一种方法可以告诉内核:如果你在一个处理器中调度这个进程,你还必须在同一个处理器中调度这个“兄弟”进程(它是通过共享内存进行通信的进程),这样performance不受惩罚。

Solutions Collecting From Web of "如何强制两个进程在同一个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中,你正在寻找的是最可能的sched_setaffinity()系统调用。

如果您不想(或不能)修改您的代码,还有schedtool命令行工具。

编写支持NUMA的应用程序不仅仅是“在同一CPU上运行的两个进程”。 NUMA意识渗透一切:内存分配,IO完成,线程调度等。

看看libnuma