我目前正在寻求将我们的系统从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:我从一个更简单的测试中向另一个问题添加了一些结果,但仍然证明了这个问题。
select
?