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

时间:2011-01-12 01:49:59

标签: c linux performance kernel numa

上下文

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

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

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

问题:

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

3 个答案:

答案 0 :(得分:4)

我认为您可以从这些手册页开始:

$ 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库也有一些功能。

答案 1 :(得分:2)

在C中你最需要的是sched_setaffinity()系统调用。

如果您不想(或不能)修改代码,还有schedtool命令行实用程序。

答案 2 :(得分:1)

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

查看libnuma