私はburnP6
(cpuburnパッケージで)1秒間実行してからプログラムを終了するシングルコアx86システムを持っています。
while true; do /usr/bin/burnP6 & sleep 1; pkill burnP6; sleep 1; done
CPU使用率を確認するために使用する場合、top -d 1
プロセスの負荷はburnP6
通常50%未満です。このコマンドを実行すると、while true; do ps -e -o cmd,pcpu | grep burnP6; done
CPUロードには次の特性があります。
/usr/bin/burnP6 0.0
/usr/bin/burnP6 9.0
/usr/bin/burnP6 10.0
/usr/bin/burnP6 10.0
/usr/bin/burnP6 11.0
/usr/bin/burnP6 11.0
/usr/bin/burnP6 12.0
/usr/bin/burnP6 12.0
/usr/bin/burnP6 13.0
/usr/bin/burnP6 14.0
/usr/bin/burnP6 15.0
/usr/bin/burnP6 15.0
/usr/bin/burnP6 16.0
/usr/bin/burnP6 16.0
/usr/bin/burnP6 17.0
/usr/bin/burnP6 18.0
/usr/bin/burnP6 18.0
/usr/bin/burnP6 19.0
/usr/bin/burnP6 20.0
/usr/bin/burnP6 20.0
/usr/bin/burnP6 21.0
/usr/bin/burnP6 22.0
/usr/bin/burnP6 22.0
/usr/bin/burnP6 23.0
/usr/bin/burnP6 24.0
/usr/bin/burnP6 24.0
/usr/bin/burnP6 25.0
/usr/bin/burnP6 25.0
/usr/bin/burnP6 26.0
/usr/bin/burnP6 27.0
/usr/bin/burnP6 28.0
/usr/bin/burnP6 28.0
/usr/bin/burnP6 28.0
/usr/bin/burnP6 30.0
/usr/bin/burnP6 30.0
/usr/bin/burnP6 31.0
/usr/bin/burnP6 31.0
/usr/bin/burnP6 32.0
/usr/bin/burnP6 32.0
/usr/bin/burnP6 33.0
/usr/bin/burnP6 33.0
/usr/bin/burnP6 35.0
/usr/bin/burnP6 35.0
/usr/bin/burnP6 36.0
/usr/bin/burnP6 36.0
/usr/bin/burnP6 37.0
/usr/bin/burnP6 38.0
/usr/bin/burnP6 38.0
/usr/bin/burnP6 39.0
/usr/bin/burnP6 40.0
/usr/bin/burnP6 40.0
/usr/bin/burnP6 41.0
/usr/bin/burnP6 42.0
/usr/bin/burnP6 42.0
/usr/bin/burnP6 43.0
/usr/bin/burnP6 44.0
/usr/bin/burnP6 44.0
/usr/bin/burnP6 45.0
/usr/bin/burnP6 45.0
/usr/bin/burnP6 46.0
/usr/bin/burnP6 46.0
/usr/bin/burnP6 47.0
/usr/bin/burnP6 48.0
/usr/bin/burnP6 48.0
/usr/bin/burnP6 49.0
/usr/bin/burnP6 50.0
/usr/bin/burnP6 50.0
/usr/bin/burnP6 51.0
/usr/bin/burnP6 52.0
/usr/bin/burnP6 52.0
/usr/bin/burnP6 53.0
/usr/bin/burnP6 0.0
上記のように、負荷は0%から53%に急速に増加しますが、プロセスはburnP6
終了します。つまり、99% - 100%の使用率に達するには短すぎます。これらの結果は測定方法によるものですか?実際、burnP6
プロセスは最初のマイクロ秒からCPUを100%使用しますか? :) または、プロセスがCPU時間をすべて取得するのに実際に1〜2秒かかりますか?
答え1
CPU負荷を表示するために使用するコマンドは、緊密なループで実行されるため、CPUburnと競合します。競合なしでCPUburnのCPU負荷を観察するには、sleep 1
ループに次のようなものを追加します。
テストでは、最初はオブザーバループがほぼすべてのCPUを占有し、次第にburnP6
CPU占有率をますます占めています。これはLinuxスケジューリングポリシーの結果です。 Linuxカーネルには複雑なスケジューラがあります。実際には多くのスケジューリングアルゴリズムがあり、実行時にどのスケジューリングアルゴリズムが使用されるかを設定できます。読むsched(7) マニュアルページ詳細については、カーネル文書と参考書を参照してください。
私よりも知識が豊富な人は、この出力を使用してシステムでどのスケジューラが有効になっているかを確認できます。できません。ps | grep
CPUを多用するI / Oプログラム(実行ファイルのロード、プロセスの作成、およびデータ転送以外に何もしないループ)の優先順位を指定することがわかります。これは多くの状況で意味があります。 CPU集中型プログラムは、計算に1秒ではなく1.1秒を費やすことを気にしないかもしれませんが、I / O集中型プログラムは通常、高速応答時間(低レイテンシ)を必要とするユーザーインターフェイススレッドまたはネットワークサービスです。 ) ありがとうございます。明らかに、すべてのCPUを占めるプロセスグループでバランスをとる一種の公平性対策があります。
設定を試して、動作がどのように変わるかを確認すると/proc/sys/kernel/sched*
便利です。