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

问题描述:

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

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

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

做了一些测试之后,问题似乎就是软件设计成基本上任何进程都可以将共享内存段传递给任何其他进程以及其中的任何线程。这似乎会导致性能下降,因为进程不断从其他进程访问内存。

问:

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

在C你正在寻找的是最有可能的sched_setaffinity()系统调用。

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

我想你可以开始与这些手册页:这取决于你是否想这样做

$ 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 
$ 

从源代码或外壳。 pthread库也有一些功能。

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

看看libnuma