小编Dav*_*sen的帖子

CFS 的 CPU 使用率高?

我问了之前的一个问题,试图找出将应用程序从 RHEL 5 迁移到 RHEL 6 时 CPU 使用率增加的原因。我为此所做的分析似乎表明它是由内核中的 CFS 引起的。我编写了一个测试应用程序来尝试验证是否是这种情况(原始测试应用程序已删除以适应大小限制,但在git repo 中仍然可用

我在 RHEL 5 上使用以下命令编译它:

cc test_select_work.c -O2 -DSLEEP_TYPE=0 -Wall -Wextra -lm -lpthread -o test_select_work
Run Code Online (Sandbox Code Playgroud)

然后我调整了参数,直到戴尔 Precision m6500 上每次迭代的执行时间约为 1 毫秒。

我在 RHEL 5 上得到以下结果:

./test_select_work 1000 10000 300 4
time_per_iteration: min: 911.5 us avg: 913.7 us max: 917.1 us stddev: 2.4 us
./test_select_work 1000 10000 300 8
time_per_iteration: min: 1802.6 us avg: 1803.9 us max: 1809.1 us stddev: 2.1 us
./test_select_work 1000 …
Run Code Online (Sandbox Code Playgroud)

cpu scheduling kernel linux-kernel

26
推荐指数
1
解决办法
4014
查看次数

确定 RHEL 6 与 RHEL 5 上 CPU 使用率较高的原因

我目前希望将我们的系统从 RHEL 5 迁移到 RHEL 6,但我遇到了一个问题,在 RHEL 6 机器上 CPU 使用率出乎意料地高。看来这可能至少在某种程度上是由于使用select来进行可中断的睡眠。这是一个显示行为的简单示例:

#include <sys/select.h>

int main()
{
  timeval ts;
  for (unsigned int ii=0; ii<10000; ++ii) {
    ts.tv_sec = 0;
    ts.tv_usec = 1000;
    select(0, 0, 0, 0, &ts);
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 RHEL 5 机器上,它的 CPU 使用率将保持在 0%,但在安装了 RHEL 6 的同一硬件上,它将使用大约 0.5% 的 CPU,因此当运行 30 到 50 个程序select用于执行睡眠时,它会占用大量不必要的 CPU。

我打开了一个Bugzilla并尝试运行 OProfile,它在查看内核时仅在主应用程序中显示 100%,在 poll_idle 中显示超过 99%(我在我的 grub 选项中设置了 idle=poll,因此可以捕获所有内容)。

关于我可以做些什么来尝试隔离 CPU 使用率较高的原因的任何其他想法?

更新:我找到了 perf 工具并得到以下输出:

# …
Run Code Online (Sandbox Code Playgroud)

cpu scheduling kernel linux-kernel

9
推荐指数
1
解决办法
6271
查看次数

标签 统计

cpu ×2

kernel ×2

linux-kernel ×2

scheduling ×2