找出RHEL 6与RHEL 5上CPU使用率较高的原因


9

我目前正在寻求将我们的系统从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。

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

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

更新:我找到了性能工具,并得到以下输出:

# 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上,用户和sys中的CPU使用率都是不小的。关于如何找到此问题的真正根源并希望予以解决的任何想法?

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

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

我是否可以对每个工具进行一些测试,以测试这种高CPU使用率是否只是计算CPU使用率方面的差异,从而使其看起来人为地高了?还是CFS窃取了实际的CPU周期?

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

UPDATE4:我向其他问题添加了更多信息。

UPDATE5:我从一个更简单的测试中向另一个问题添加了一些结果,但仍然证明了这个问题。


似乎RedHat已将其精确定位到GLibC。您是否在寻找有关代码的更改select
Nils 2012年

我最初提交Bugzilla时由我完成了glibc的分类。
戴夫·约翰森

对我来说听起来很合理(而不是内核问题)。多次并发睡眠会得到类似的结果吗?Ubuntu 11.10,Arch Linux和RHEL6的glibc版本是什么?
尼尔斯2012年

是的,轮询和usleep睡眠1 ms的结果相同。至于glibc,RHEL 5是2.5,RHEL 6是2.12,Ubuntu 11.10是2.13,我相信arch是2.15,但是我必须检查一下。
戴夫·约翰森

看来您自己找到了这个原始问题的答案。在此处将其发布为答案,并为此赚取积分!
尼尔斯2012年

Answers:


1

你问:

我是否可以对每个工具进行一些测试,以测试这种高CPU使用率是否只是计算CPU使用率方面的差异,从而使其看起来人为地高了?还是CFS窃取了实际的CPU周期?

如果在运行test_select_small程序时运行CPU基准测试,并查看其性能是否随主机OS版本而变化,该怎么办?

有很多选择:经典建议始终是“使用代表您将要承受的负载的东西”。但是很酷的孩子总是只使用povray


1
我认为那是我所指的想法。您是否推荐这样的基准测试应用程序,它可以提供一致的计时结果供我使用?
戴夫·约翰森

@DaveJohansen -的povray上补充说明
ckhan

不幸的是,除非RHEL随附,否则至少需要一两个星期才能在这些系统上获得任何软件。我制定了自己的小测试程序,并提出了一个新问题来讨论结果。
戴夫·约翰森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.