Linux调度程序(不使用多核机器上的所有核心)RHEL6

我在其中一台服务器(运行RHEL 6)上看到了奇怪的行为。 调度程序似乎有问题。

这是我正在使用的testing程序:

#include <stdio.h> #include <unistd.h> #include <stdlib.h> void RunClient(int i) { printf("Starting client %d\n", i); while (true) { } } int main(int argc, char** argv) { for (int i = 0; i < 4; ++i) { pid_t p_id = fork(); if (p_id == -1) { perror("fork"); } else if (p_id == 0) { RunClient(i); exit(0); } } return 0; } 

这台机器有4个以上的核心,所以我们希望所有的进程都能以100%的速度运行。 当我检查顶部时,CPU使用率会有所不同。 有时它是分裂的(100%,33%,33%,33%),有时是分裂的(100%,100%,50%,50%)。

当我在我们的另一台服务器(运行RHEL 5)上尝试这个testing时,没有问题(100%,100%,100%,100%)。 这是什么原因造成的?我该如何解决?

谢谢

你似乎在重新发明轮子,已经有各种CPU酷刑程序,如stress 。 我敢打赌,C编译器会以这样的方式优化您的程序,在testing运行期间不需要不断地刻录CPU。

尝试

 stress -c 4 -t 60 

这将启动4个CPU密集型进程,并将运行60秒的testing。 我敢打赌,你会看到四个核心运行在100%。 虽然如果你的内核数量比4多(比如16),那么结果可能会有所不同,除非你使用压力命令来使用特定的内核与taskset

那么红帽5和6之间有很大的区别。我认为最大的一个会影响你的用例是切换到完全公平的调度程序。 它不会被破坏,但是与RHEL 5中的调度程序相比,它可能performance出不同的行为。它将允许之前完全忽略的进程被允许一些处理器时间。

我也会认为空while循环大部分是空操作,如果你为汇编打开了任何优化的话,它将被优化成遗忘(我不是那么多的C程序员,但我相信是这种情况;它甚至可能发生没有明确的优化标志,因为它是完全redudant)。 尝试把一些实际的计算在那里,看看会发生什么。

作为一般规则,除非您足够了解编写您自己的内核调度程序,否则我会认为这不是一个错误,而是一个系统如何工作的performance。 或者你的代码/仪器的问题。