4

语境:

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

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

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

问题:

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

4

3 回答 3

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
$

取决于您是要从源代码还是外壳程序中执行此操作。pthread 库也有一些功能。

于 2011-01-12T01:58:03.737 回答
2

在 C 中,您正在寻找的很可能是sched_setaffinity()系统调用。

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

于 2011-01-12T01:56:59.160 回答
1

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

看一下libnuma

于 2011-01-12T02:07:54.537 回答