kov*_*van 4 c linux performance kernel numa
语境:
我正在编写一个由多个进程组成的软件系统。它是在Linux下用C++编写的。它们之间使用 Linux 共享内存进行通信。
通常,在软件开发中,性能优化是在最后阶段进行的。在这里我遇到了一个大问题。该软件对性能要求较高,但在 4 或 8 个 CPU 核心(通常不止一个 CPU)的机器上,只能使用 3 个核心,因此浪费了第一个核心 25% 的 CPU 能力,而在第一个核心上浪费了 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
$
Run Code Online (Sandbox Code Playgroud)
取决于您是想从源代码还是 shell 中执行此操作。pthread库也有一些功能。
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |