web-dev-qa-db-ja.com

「負荷平均」は「トップ」出力でどのように解釈されますか?すべてのディストリビューションで同じですか?

Red-HatベースのLinuxの出力が、DebianベースのLinuxによって異なって解釈される可能性があるかどうか知りたいのですが。

質問をさらに具体的にするために、私が求めているのは、Red-Hatシステムのtopコマンドの最初の行からの「負荷平均」がどのように解釈され、どのようにこれを公式ドキュメントroコードで確認してください。

[この主題にアプローチするには多くの方法がありますが、これらはすべて質問に対する許容できる回答です]

1つの潜在的なアプローチは、この情報が公式に文書化されている場所を見つけることです。
もう1つは、topのビルド元のコードバージョンを、私が作業している特定のディストリビューションとバージョンで見つけることです。

私が取得しているコマンド出力は次のとおりです。

_    top - 13:08:34 up  1:19,  2 users,  load average: 0.02, 0.00, 0.00
    Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 96.8%id,  2.7%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3922520k total,   788956k used,  3133564k free,   120720k buffers
    Swap:  2097148k total,        0k used,  2097148k free,   344216k cached
_


この場合、load average値をどのように解釈できますか?
1つのドキュメントソースからの平均負荷が最後の約1分間であり、別のドキュメントソースで100を乗算した後に解釈する必要があることを確認できました。
それで、問題は:
0.02%または2%が読み込まれていますか?
ドキュメントのソースとバージョン:

1)最初の星は

_    TOP(1)                        Linux User’s Manual                       TOP(1)

    NAME
           top - display Linux tasks
_

出典:RedHatディストリビューションの_man top_
Ubuntuには、「タスク」を備えたバージョンもあり、次のような平均負荷を説明していません。
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2)2つ目は

_    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes
_

ソース:
http://man7.org/linux/man-pages/man1/top.1.htm

3)これは次で始まります:

_   TOP(1)

   NAME

   top - display and update information about the top cpu processes
_

出典: http://www.unixtop.org/man.shtml

firstは、RHELまたは_man top_の_online ubuntu documentation_で確認できます。そしてそれは出力フォーマットについての説明がありません(私が興味を持っている負荷平均についても)。

secondは簡単な説明を含み、負荷平均は最後の1分間に関係していることを指摘していますが、その価値の解釈!

私は2番目のソースから直接引用します:

2a。 UPTIMEとLOADの平均
この部分は、以下を含む1行で構成されています。
表示モードに応じて、プログラムまたはウィンドウ名
現在の時刻と最後の起動からの時間の長さ
ユーザーの総数
過去1、5、15分間のシステム負荷平均

したがって、この説明が実際に正しい場合、負荷平均が最後の1分間であることを理解するだけで十分です。
しかし、それは数値の形式を説明していません。

サードの説明では、それは言う:

負荷平均の数値を指定する場合は、100を掛ける必要があります。

この説明は、0.02が0.02%ではなく2%を意味することを示唆しています。しかし、これは正しいですか?さらに、Linuxのすべてのディストリビューションとtopの異なる実装の可能性に対して正しいですか?
この質問に対する答えを見つけるために、オンラインでコードを検索してコードを調べました。しかし、少なくとも、RHELに関連するtopの2つの異なるバージョンを見つけました! _builtin-top.c_およびリファクタリングされた_top.c_。どちらもRed-Hatの著作権で保護されており、コードの冒頭で告知​​されているように、RHELがこれらのいずれかを使用していることは論理的です。
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

それで、その多くのコードを掘り下げる前に、CPU負荷がどのように解釈されるかについて正確な理解を形成するためにどこに焦点を当てるべきかについての意見が必要でしたか?

以下の回答で提供された情報から、いくつかの個人的な検索に加えて、私はそれを発見しました:

1-私が使用しているtopは、procps-3.2.8パッケージに含まれています。 _top -v_を使用して確認できます。
2-公式ウェブサイトからダウンロードした_procps-3.2.8_のバージョンでは、ツールuptimeprocfsファイルから情報を取得しているようです_/proc/loadavg_直接(Linux関数getloadavg()を利用しない)。
3-topコマンドでは、関数getloadavg()も使用しません。負荷平均を表示するために、topが実際にuptimeツールと同じことを確認できました。実際には、uptimeツールの関数を呼び出し、procfsファイル_/proc/loadavg_から情報を取得します。

つまり、すべてが_/proc/loadavg_ファイルを指しています!したがって、topによって生成される_load average_を正確に理解するには、カーネルコードを読み取って、ファイルloadavgがどのように記述されているかを確認する必要があります。
また、回答の1つで指摘された優れた記事で、loadavgの3つの値に関する素人の用語の説明が提供されています。
それで、すべての回答が等しく有用で役立つという事実にもかかわらず、記事を指し示したものに印を付けます http://www.linuxjournal.com//article/9001 私の質問への「その」答えとして。あなたの貢献に感謝します!

さらに質問 トップと負荷の平均を理解する から、loadavgが計算される場所を指すカーネルのソースコードへのリンクを見つけました。動作を説明する巨大なコメントがあるように、コードのこの部分もCにあります!
コードへのリンクは http://lxr.free-electrons.com/source/kernel/sched/loadavg.c です。
繰り返しますが、いかなる形の盗用にも従事しようとはしていません。完全を期すために、これを追加しています。つまり、カーネルコードへのリンクが nderstanding top and load average ...の回答の1つから見つかったことを繰り返します。

12

CPU負荷は、実行キューの長さ、つまり実行を待機しているプロセスのキューの長さです。

uptimeコマンドを使用すると、topで通常表示されるのと同じように、最後の1分間、最後の5分間、および最後の15分間の実行キューの平均の長さを確認できます。

高い負荷値は、実行キューが長いことを意味します。低い値は、それが短いことを意味します。したがって、1分の負荷平均が0.05の場合、その1分間の平均で、実行キューで実行を待機しているプロセスが0.05あったことを意味します。パーセンテージではありません。これはAFAIKであり、すべてのUnicesで同じです(ただし、一部のUnicesはI/Oを待機しているプロセスをカウントしない場合がありますが、これはLinuxと同じです。OpenBSDもしばらくの間、カーネルスレッドをカウントしたため、負荷は常に1またはもっと)。

Linux topユーティリティはカーネルからロード値を取得し、カーネルがそれらを_/proc/loadavg_に書き込みます。 _procps-3.2.8_ のソースを見ると、次のことがわかります。

  1. 負荷平均を表示するために、sprint_uptime()関数が_top.c_で呼び出されます。
  2. この関数は_proc/whattime.c_に存在し、_proc/sysinfo.c_でloadavg()を呼び出します。
  3. この関数は、単純に_LOADAVG_FILE_を開いて、平均負荷を読み取ります。
  4. _LOADAVG_FILE_は、以前は_"/proc/loadavg"_として定義されています。
19
Kusalananda

負荷平均は通常、カーネルによって計算されます。 topuptimeなどのアプリケーションは、getloadavg(3)ライブラリー呼び出しを使用してこれにアクセスできます(これは、異なるUnixバージョン間で移植可能であることを意味します)。 Linuxでは通常、これにより_/proc/loadavg_からの読み取りになります。 FreeBSDでは、システムコールです。

例えば:

_#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  double ld[3];

  int i=getloadavg(ld,3);
  printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}
_

uptimetopはどちらも、同様の呼び出しを行ってデータを取得します。

現在、1/5/15分の負荷平均は、実行キューにあるプロセスの数です。異なるオペレーティングシステムmay異なる方法でこれを計算します。最大の違いは通常、I/Oを待機しているプロセス(ディスク上でブロックされているなど)が実行可能としてカウントされるかどうかです。 Linuxではそうです。

したがって、負荷平均3.4は、サンプルウィンドウ内の実行キューに平均3.4プロセスがあったことを意味します(1、5、15分)。

ただし、負荷平均が高くても、サーバーが過負荷になっているとは限りません。 16コアの場合、負荷平均はストレスなしで16になります。また、多数のアプリケーションfork()呼び出しがあり、その結果、多数のプロセスが作成/破棄され、負荷平均が高くなりますが、サーバーのパフォーマンスに大きな影響を与えることはありません。 %CPUビジーなどの他のメトリックと共に、ガイドとしてのみ使用する必要があります。

7
Stephen Harris

負荷平均は、特定のツールや分布に固有のものではなく、カーネルによって提供される測定値であり、正確にはスケジューラーであり、したがって、分布に依存しない測定値です。測定値は、procファイルシステム_/proc_内に記録されます

それを解釈すると、負荷平均メトリックはnotであり、CPUがどれだけハードに動作しているかを示していますが、どれだけの作業を実行する必要があるかを示しています。これは、実行可能状態または割り込み不可能な状態のいずれかのプロセス数を直接測定するものであるため、実際に何かを掛ける必要はないと思います。

詳細については、getloadavg(3)およびuptimeの2つのmanページを確認してください。

負荷平均メトリックは、最初は理解するのが難しい概念である可能性があります。多くの人々は、それがCPUがどれほどハードに動作しているかを示すものであると考えていると思いますが、実際はそうではありません。

4
pmyjavec