ディスクが遅いと Linux の負荷が急増する理由についての簡単な説明

まずは理由と結論からお話しましょう

Linux システムでは、負荷平均インジケーターは、それが何を意味するのかわからないため、基本的に役に立ちません。高い負荷平均が表示されても、実行可能なプロセスが多すぎるのか、中断できないスリープ プロセスが多すぎるのかがわかりません。 , CPUが不足しているのか、IOデバイスがボトルネックになっているのかは判断できません。

ディスクが遅いとき(大量のディスクが使用されているとき)、CPU 負荷が急増する理由を別の方法で説明します。基本的に、CPU 負荷が高くなると、次の 2 つの状況が発生します。

  1. CPU 自体が処理するタスクが多すぎ、ソフト割り込みやコンテキストの切り替えが頻繁に行われるため、負荷が高くなります。
  2. さらに、ディスクが遅すぎるため、中断できないスリープが多くなり、CPU 負荷が高くなります。

中断されない睡眠プロセスの理解

中断不可能なスリープ状態の理由は、プロセスがディスク IO、ネットワーク IO などの IO を待機しているためです。発行された IO リクエストが応答を受信しなかった後、プロセスは通常、中断不可能なスリープ状態に入ります。たとえば、NFS サーバーが閉じていて、関連するディレクトリが事前に割り当てられていない場合、クライアントで df を実行するとセッション全体がハングします。ps axf を使用して表示すると、df プロセス ステータス ビットが次のように変化していることがわかります。 D2.

1. CPU使用率と負荷率の違い

ここに画像の説明を挿入します
ここでは、CPU 負荷と CPU 使用率を区別する必要があります。これらは 2 つの異なる概念ですが、それらの情報は同じ top コマンドで表示できます。CPU 使用率は、プログラムの実行中にリアルタイムで CPU が占有されている割合を示します。これは、一定期間内の CPU 使用率の統計です。このインジケーターにより、一定期間内に CPU がどの程度占有されているかを確認できます。占有されている場合 時間が非常に長い場合は、CPU がすでに過負荷になっているかどうかを考慮する必要があります。CPU負荷は、一定時間内にCPUが処理中およびCPUの処理を待っているプロセス数の合計の統計情報であり、CPU使用キューの長さの統計情報でもあります。

CPU 使用率が高いからといって、負荷が大きいというわけではありません。タスクが CPU を集中的に使用している可能性があります。CPU 使用率が同じ低い状況でも、負荷平均が高くなりますか? 占有時間と使用時間を理解すると、CPU がタイム スライスを割り当てるときに、それを使用するかどうかは完全にユーザーに依存するため、使用率が低くても平均負荷が高くなる可能性があることがわかります。さらに、IO デバイスも CPU 負荷を高める可能性があります。

この観点から見ると、CPU 使用率だけで CPU が過負荷状態にあるかどうかを判断するのは不十分で、Load Average と組み合わせて CPU 使用率を全体的に見る必要があります。この 2 つの違いを示す例がインターネットにあります: 公衆電話ボックスでは、電話をかけている人が 1 人、待っている人が 4 人います。電話の使用時間は 1 人あたり 1 分間に制限されています。誰かが通話を終えなかった場合1 分以内に電話を切ることしかできません。電話をかけて列に並び、次のラウンドを待ちます。ここでの電話は CPU に相当し、電話をかけている人や電話を待っている人はタスクの数に相当します。電話ボックスの利用中は、電話をかけて必ず帰る人、電話が終わらずにまた並ぶ人、さらには新たに並ぶ人もいます。タスクの数が増えたり減ったり。平均負荷をカウントするために、5 秒ごとに人数をカウントし、1 分、5 分、15 分での統計を平均して、1 分、5 分、15 分での平均負荷を算出します。電話を取ってすぐに電話をかけ、通話が 1 分間続く人もいれば、最初の 30 秒で電話番号を探したり、電話するか迷ったりして、最後の 30 秒で実際に電話する人もいるでしょう。電話機をCPU、人数をタスクとみなした場合、前者(タスク)のCPU使用率が高く、後者(タスク)のCPU使用率が低いといいます。もちろん、最初の 30 秒間は CPU は動作せず、次の 30 秒間は停止し、CPU は動作し続けます。ただ、一部のプログラムでは多くの計算が行われるため CPU 使用率が高くなりますが、一部のプログラムでは計算がほとんどないため、必然的に CPU 使用率が低くなります。ただし、CPU 使用率が高いか低いかは、後でキューに入れられるタスクの数とは関係ありません。

タスクは最終的に CPU コアに割り当てられて処理されるため、CPU の数と CPU コアの数 (つまり、コアの数) が CPU 負荷に影響します。2 つの CPU は 1 つの CPU よりも優れており、デュアル コアはシングル コアよりも優れています。したがって、CPU負荷はCPUの性能の違いとは別に、「コアが何個あるか、つまり負荷がどれだけあるのか」というコア数に基づいて計算されることを覚えておく必要があります。単一コアの場合は 100% を超えないことが最善です。つまり、負荷は 1.00 などです。

Linux には、現在実行中のシステムの仮想マッピングを保存する /proc ディレクトリと、CPU 情報を保存する cpuinfo というファイルがあります。/proc/cpuinfo ファイルでは、実際の CPU ではなく論理 CPU ごとにセクションに情報が表示されます。各論理 CPU の情報は 1 セクションを占め、最初の論理 CPU 識別子は 0 から始まります。

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 63
model name      : Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz
stepping        : 2
microcode       : 0x36
cpu MHz         : 2399.998
cache size      : 20480 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 15
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ......
bogomips        : 4799.99
clflush size    : 64
cache_alignment : 64
address sizes   : 42 bits physical, 48 bits virtual
power management:

このファイル内の CPU 情報を理解するには、次のような関連する概念を理解する必要があります。プロセッサーは論理 CPU の ID を表し、モデル名は実際の CPU のモデル情報を表し、物理 ID は実際の CPU と ID を表します。 cpu cores は実際の CPU を表し、コア数などを表します。

論理 CPU の説明: 現在のサーバーは通常、CPU パフォーマンスを向上させるために「ハイパー スレッディング」(HT) テクノロジーを使用しています。ハイパー スレッディング テクノロジにより、CPU は複数のプログラムを同時に実行し、CPU 内のリソースを共有できます。理論的には、2 つの CPU のように 2 つのスレッドを同時に実行する必要があります。ハイパー スレッディング テクノロジは 2 つのスレッドを同時に実行できますが、実際の 2 つの CPU とは異なり、各 CPU には独立したリソースがあります。2 つのスレッドが同時にリソースを必要とする場合、続行する前に、一方のスレッドを一時的に停止し、これらのリソースがアイドル状態になるまでリソースを放棄する必要があります。したがって、ハイパースレッディングのパフォーマンスは 2 つの CPU のパフォーマンスと等しくありません。ハイパー スレッディング テクノロジを搭載した CPU には、他にも制限があります。

2. CPU負荷率の計算方法

ロードアベレージの概念は UNIX システムに由来しており、各社の計算式は異なりますが、いずれも CPU を使用しているプロセス数と CPU を待機しているプロセス数を測定するために使用されます。実行可能なプロセスの数。したがって、ロードアベレージはCPUボトルネックの参考指標となり、CPU数よりも大きい場合はCPUが不足している可能性があります。

ただし、Linux では少し異なります。

Linux の負荷平均には、CPU を使用しているプロセスの数と CPU を待機しているプロセスの数に加えて、中断のないスリープ プロセスの数も含まれます。通常、IO デバイスとネットワークを待機しているとき、プロセスは中断できないスリープ状態になります。Linux 設計者の論理は、中断不可能なスリープは非常に短時間であるべきであり、すぐに動作を再開するため、実行可能であるとみなされるというものです。ただし、中断できないスリープは、たとえ短くてもスリープであることに変わりはありません。現実の世界では中断できないスリープがそれほど短くない可能性があることは言うまでもありません。中断できないスリープの回数が多い、または長い場合は、通常、IO デバイスがボトルネックに遭遇していることを意味します。ご存知のとおり、スリープ状態のプロセスには CPU が必要なく、すべての CPU がアイドル状態であってもスリープ プロセスは実行できないため、スリープ プロセスの数は CPU 負荷を測定する指標としては決して適していません。中断できないスリープ プロセスをカウントします。負荷平均を入力する行為は、負荷平均の本来の意味を直接覆すことになります。したがって、Linux システムでは、負荷平均インジケーターは、それが何を意味するのかわからないため、基本的に役に立ちません。高い負荷平均が表示されても、実行可能なプロセスが多すぎるのか、中断できないスリープ プロセスが多すぎるのかがわかりません。 CPUが不足しているのか、IOデバイスがボトルネックになっているのか判断できません。

逆に、ディスクが遅いとき(大量のディスクを使用しているとき)に CPU 負荷が急増する理由はこれで説明できます。基本的に、高い CPU 負荷が発生した場合、2 つの状況が考えられます。CPU 自体が処理するタスクが多すぎることに加え、ソフト割り込みとコンテキスト スイッチが頻繁に行われ、その結果高負荷が発生します。もう 1 つはディスクが遅すぎて、中断できないスリープが多すぎるためです。これにより、CPU の負荷が高くなります。

以上が、ディスクが遅いと Linux の負荷が急上昇する理由に関するこの記事の全内容ですので、皆様のお役に立てれば幸いです。興味のある友人は、引き続きこのサイトの他の関連トピックを参照してください。不足点がある場合は、メッセージを残して指摘してください。このサイトをサポートしてくださったお友達に感謝します!

おすすめ

転載: blog.csdn.net/tian830937/article/details/132636387