我目前正在考虑将我们的系统从 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 基准测试,并查看其性能是否会根据主机操作系统版本而变化,该怎么办?
有很多选择:经典的建议始终是“使用代表您将拥有的负载类型的东西”。但酷孩子总是只是用波夫赖