現在、システムを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を実行してみましたが、カーネルを見るとアプリケーションのメインでは100%だけ表示され、poll_idleでは99%が少し以上と表示されます(すべてをキャプチャできるようにgrubオプションでアイドル=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問題ではなく、ある種のカーネル問題のようです。
アップデート2:この質問は大きな議論であることを知っているので、私は質問するのを少し躊躇しましたが、Ubuntu 11.10でBFSパッチを使用してカーネルを試しましたが、システムCPU使用率は同じに高くありませんでした(ユーザーCPU使用率はほぼ同じです)。
これらの高いCPU使用率が単にCPU使用率計算の違いのために人工的に高く見えるかどうかをテストするために、それぞれに対していくつかのテストを実行できますか?それとも、CFSは実際のCPUサイクルを盗んでいますか?
アップデート3:この問題に関する分析はスケジューラに関連していることがわかりました新しい質問議論の結果。
アップデート4:より多くの情報を追加しました。その他の問題。
アップデート5:いくつかの結果を追加しました。その他の問題それでも問題を示す簡単なテストで。
答え1
尋ねる:
これらの高いCPU使用率が単にCPU使用率計算の違いのために人工的に高く見えるかどうかをテストするために、それぞれに対していくつかのテストを実行できますか?それとも、CFSは実際のCPUサイクルを盗んでいますか?
プログラムの実行中にCPUベンチマークを実行し、ホストOSのバージョンによってパフォーマンスが変化することを確認したらtest_select_small
どうなりますか?
多くのオプションがあります。古典的なアドバイスは、常に「あなたが持つことになる負荷の種類を表すものを使用してください」です。しかし、素敵な子供たちはいつもフォープライ