隔离 RHEL 6 与 RHEL 5 上 CPU 使用率较高的原因

隔离 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;
}

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

我开了一个布吉拉我尝试运行 OProfile,在查看内核时,它仅在应用程序的 main 中显示 100%,在 poll_idle 中显示略高于 99%(我在 grub 选项中设置了idle=poll,以便可以捕获所有内容)。

我还能做些什么来尝试找出 CPU 使用率较高的原因吗?

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

# Events: 23K cycles
#
# Overhead  Command        Shared Object                                Symbol
# ........  .......  ...................  ....................................
#
    13.11%  test_select_sma  [kernel.kallsyms]    [k] find_busiest_group
     5.88%  test_select_sma  [kernel.kallsyms]    [k] schedule
     5.00%  test_select_sma  [kernel.kallsyms]    [k] system_call
     3.77%  test_select_sma  [kernel.kallsyms]    [k] copy_to_user
     3.39%  test_select_sma  [kernel.kallsyms]    [k] update_curr
     3.22%  test_select_sma  ld-2.12.so           [.] _dl_sysinfo_int80
     2.83%  test_select_sma  [kernel.kallsyms]    [k] native_sched_clock
     2.72%  test_select_sma  [kernel.kallsyms]    [k] find_next_bit
     2.69%  test_select_sma  [kernel.kallsyms]    [k] cpumask_next_and
     2.58%  test_select_sma  [kernel.kallsyms]    [k] native_write_msr_safe
     2.47%  test_select_sma  [kernel.kallsyms]    [k] sched_clock_local
     2.39%  test_select_sma  [kernel.kallsyms]    [k] read_tsc
     2.26%  test_select_sma  [kernel.kallsyms]    [k] do_select
     2.13%  test_select_sma  [kernel.kallsyms]    [k] restore_nocheck

看来较高的 CPU 使用率来自于调度程序。我还使用以下 bash 脚本同时启动其中 100 个:

#!/bin/bash

for i in {1..100}
do
  ./test_select_small &
done

在 RHEL 5 上,CPU 使用率保持接近 0%,但在 RHEL 6 上,用户和系统中的 CPU 使用率都很高。关于如何追踪这个问题的真正来源并希望解决它有什么想法吗?

我还在当前的 Arch Linux 版本和 Ubuntu 11.10 上尝试过此测试,并看到类似的行为,因此这似乎是某种类型的内核问题,而不仅仅是 RHEL 问题。

UPDATE2:我有点犹豫是否要提出这个问题,因为我知道这是一个巨大的争论,但我在 Ubuntu 11.10 上尝试了带有 BFS 补丁的内核,但它没有显示出同样高的系统 CPU 使用率(用户 CPU 使用率似乎约为相同)。

我是否可以对它们中的每一个运行一些测试,以测试这种高 CPU 使用率是否只是 CPU 使用率计算上的差异导致它看起来人为地高?或者 CFS 是否窃取了实际的 CPU 周期?

UPDATE3:涉及这个问题的分析似乎表明它与调度程序有关,所以我创建了一个新问题讨论结果。

UPDATE4:我添加了一些更多信息其他问题

UPDATE5:我添加了一些结果其他问题来自一个更简单的测试,仍然证明了这个问题。

答案1

你问:

我是否可以对它们中的每一个运行一些测试,以测试这种高 CPU 使用率是否只是 CPU 使用率计算上的差异导致它看起来人为地高?或者 CFS 是否窃取了实际的 CPU 周期?

如果您在运行test_select_small程序时运行 CPU 基准测试,并查看其性能是否会根据主机操作系统版本而变化,该怎么办?

有很多选择:经典的建议始终是“使用代表您将拥有的负载类型的东西”。但酷孩子总是只是用波夫赖

相关内容