3つの負荷フィールドすべてで、特定のマシン(約9)の高い負荷平均を観察しています。負荷は、「実行中」/現在必要なCPU時間のプロセス数として理解しています。私のマシンでN個のプロセスが実行されている場合、これはNより大きな負荷を生成できないと推論するのは正しいですか?
また、負荷はプロセスまたはスレッドに関してカウントされますか?言い換えると、マルチスレッドプロセスは1より大きい負荷を生成できますか?
負荷平均は通常、「実行キューの平均長」として表されます。そのため、CPUを消費するプロセスやスレッドがほとんどないため、LAが1を超える可能性があります。LAがCPUコアの総数より少ない場合でも、問題はありません。しかし、CPUの数よりも多くなる場合、これは、一部のスレッド/プロセスがキューに留まり、実行可能な状態になりますが、空きCPUを待機することを意味します。
負荷平均の計算に使用される数値は、実行状態または中断不可能な状態のタスクと、移動平均のタイムスライスで実行された作業量です。これらのタスクは、マルチスレッドプロセスの一部にすることができます。使用されたアルゴリズムからの結果を平滑化するため、フィールドは過去にさかのぼってぼやけています。
負荷1は、1つのCPUに相当する作業の100%に相当します。使用可能なCPUの数を超えるアクティブなスレッドの数を管理するマルチスレッドアプリケーションがある場合は、単一のプロセスで1を超える負荷を駆動することができます。これは短期間のスパイクであり、負荷平均のより長いタイムスライスビュー。
また、マルチコアシステムが存在する前に負荷平均が開発されたため、負荷数を使用可能なコアの総数で割ることが重要です。これが4ソケットクアッドコアシステムでの9の持続負荷である場合、これは9 of 16の負荷であり、実際には問題ではありません。
kernel/sched/loadavg.c を参照してください。これは、実行可能なスレッド(「実行キュー」)の数の指数関数的に減少する平均からの負荷平均の導出を説明する最初に長くて優れたコメントがあります。割り込み不可能なスレッドの数(I/Oで待機中またはロックで待機中)。
コメントの本質は次のとおりですが、完全に読む価値があります。
* The global load average is an exponentially decaying average of
* nr_running + nr_uninterruptible.
*
* Once every LOAD_FREQ:
* nr_active = 0;
* for_each_possible_cpu(cpu)
* nr_active += cpu_of(cpu)->nr_running +
* cpu_of(cpu)->nr_uninterruptible;
* avenrun[n] = avenrun[0] *
* exp_n + nr_active *
* (1 - exp_n)
実際には、コードはやや複雑になります。CPUごとのカウンター、ティックレスカーネル、ホットスワップCPU、exp(n)の固定小数点実装を必要とする浮動小数点コードの欠如。しかし、コメントに記載されている方法を忠実に実装するために、これらすべてが機能していることは容易に理解できます。
Linuxはプロセスだけでなくthreadsをカウントすることに注意してください。これは質問に答えます。
3つの負荷平均は、数値1を中心に回転する対数関数のようなものです。f(x) = eX(e to the X exponent)に似ています。技術的にはaの固定小数点表現平均をシミュレートする指数関数的減衰関数です。これらはCPUごとに加算されるため、クアッドコアシステムでは全負荷が4.00のようになります。最初の数値は過去1分間の平均、2番目は過去5分間の平均です、そして3番目は過去15分間の平均です。私は、それについて言及している答えをここにドロップする必要があると思いました。
インスタントロード:実行中または実行を待機しているタスクの数、または別の方法で、実行する意思のあるタスクの数
負荷平均:上記の測定値ですが、同じ測定値の以前のサンプルで指数関数的に平均化されています
これらの数値は両方とも無制限であり、多くの場合Nよりはるかに大きくなります。
明確にするために、Linuxのロードカウントにはスレッドが含まれています。多くのスレッドを作成する単一のプロセスで、任意の大きな負荷を生成できます。
詳細はこちら
http://blog.angulosolido.pt/2015/04/linux-load-average-definitive-summary.html