语境:
我正在编写一个由多个进程组成的软件系统.它在Linux下用C编程.他们使用Linux共享内存在他们之间进行通信.
通常,在软件开发中,处于性能优化的最后阶段.在这里,我遇到了一个大问题.该软件具有高性能要求,但在具有4或8个CPU内核(通常具有多个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库也有一些功能.