LinuxのCPU負荷とCPU使用率の詳細な説明

LinuxのCPU負荷とCPU使用率の詳細な説明

CPU 負荷と CPU 使用率

これらは両方とも、ある程度、マシンの忙しさを反映できます。

CPU 使用率は、現在の CPU の忙しさを反映します。変動の理由は、CPU 処理時間を占有しているプロセスが IO 待機状態にあるが、待機状態にまだ解放されていない可能性があるためです。

ロードアベレージとは、一定時間内にCPU時間を占有し、CPU時間を待機しているプロセスの数を指します。ここで、CPU時間を待機しているプロセスとは、待機状態にあるプロセスを除いた、起動を待っているプロセスを指します。

上記の分析から、マシンはCPU使用率が低く、負荷が高い状況にある可能性が高いことがわかります。したがって、マシンの忙しさは、両方を組み合わせて見る必要があります。実際の使用状況の観察から、私のデュアルコアXeon 2.8GHZ、2Gメモリマシンの平均負荷は約50で、CPU使用率は100%に近づいています(アプリケーションのIO操作が多い)。この場合、アプリケーションはまだスムーズで、実際のアクセス遅延はそれほど高くありません。したがって、CPU がまだアイドル状態のときに、IO 応答をいかに改善するかが負荷を軽減する鍵となります。負荷が数十に達すると、マシンが非常に忙しいと考える人が多いです。このとき CPU 使用率が比較的低い場合、高負荷では問題を十分に説明できない可能性があります。CPU によって処理されたプロセスが完了すると、それらの待機中のプロセスもすぐに応答を得ることができます。この場合、IO 読み取りおよび書き込み速度を最適化する必要があります。平均負荷が 1 桁であっても (たとえば、特定のプロセスが常に実行されているなど)、CPU 使用率が常に 90% を超えている場合は、マシンは実際にはビジー状態です。

実は前回の記事でもCPU使用率が低いのに負荷が高いと書いてありました。CPU使用率が低いのに負荷が非常に高い理由は、高負荷はIOかもしれない

CPU負荷のアナロジー

システムが過負荷になっているかどうかを判断するには、負荷平均の真の意味を理解する必要があります。以下では、「Linux CPU 負荷の理解」という記事に基づいて、最も一般的な言語でこの問題を説明してみます。
まず、コンピューターに CPU が 1 つしかなく、すべての計算をこの CPU で実行しなければならないという最も単純なケースを想定してみましょう。
さて、この CPU を 1 車線のみの橋と想像すると、すべての車両はこの車線を通過する必要があります。 (当然ですが、橋は一方向のみ通行可能です。)
システム負荷は 0 です。つまり、橋の上に車はありません。

システム負荷は 0.5 です。つまり、橋の半分に車が通っていることになります。

システム負荷が 1.0 の場合、橋のすべてのセクションに車があり、橋が「満杯」であることを意味します。しかし、この時点ではまだ橋は通行可能であったことに注意する必要があります。

システム負荷は 1.7 で、車両が多すぎて橋がすでに満杯 (100%) になっており、橋への搭乗を待っている車両が橋上の車両の 70% を占めていることを意味します。同様に、システム負荷が 2.0 の場合、橋への搭乗を待機している車両の数が橋の​​デッキ上の車両の数と同じであることを意味し、システム負荷が 3.0 の場合、橋への搭乗を待機している車両の数が橋の​​デッキ上の車両の数の 2 倍であることを意味します。つまり、システム負荷が 1 より大きい場合、後続の車両は待機する必要があり、システム負荷が大きいほど、橋を渡るのに待機する時間が長くなります。

CPU のシステム負荷は、基本的に上記の例えと同じです。橋の交通容量は CPU の最大作業負荷であり、橋の上の車両は CPU による処理を待機しているプロセスです。
CPU が 1 分間に最大 100 個のプロセスを処理する場合、システム負荷が 0.2 であれば、CPU はこの 1 分間に 20 個のプロセスのみを処理します。システム負荷が 1.0 であれば、CPU はこの 1 分間にちょうど 100 個のプロセスを処理し、システム負荷が 1.7 であれば、CPU によって処理される 100 個のプロセスに加えて、CPU による処理を待機しているプロセスが 70 個あることを意味します。
コンピュータのスムーズな動作を確保するには、システム負荷が 1.0 を超えないようにする必要があります。そうすることで、プロセスを待機させる必要がなくなり、すべてのプロセスをできるだけ早く処理できるようになります。明らかに、1.0 は臨界値です。この値を超えると、システムは最適な状態ではなくなり、介入が必要になります。

CPU 負荷 - マルチプロセッサ

上記では、コンピューターに CPU が 1 つしかないことを前提としています。コンピュータに 2 つの CPU が搭載されていたらどうなるでしょうか?
CPU が 2 つになると、コンピューターの処理能力が 2 倍になり、同時に処理できるプロセスの数も 2 倍になります。
もう一度、橋の例えを使ってみましょう。CPU が 2 つあるということは、橋に 2 つのレーンがあることを意味し、トラフィック容量が 2 倍になります。

したがって、CPU が 2 つある場合、システム負荷は 2.0 に達する可能性があり、その時点で各 CPU の作業負荷は 100% に達します。一般的に、n 個の CPU を持つコンピュータの場合、許容可能な最大システム負荷は n.0 です。

CPU 負荷 - マルチコア プロセッサ

チップメーカーは、多くの場合、単一の CPU 内に複数の CPU コアを組み込んでおり、これをマルチコア CPU と呼びます。
システム負荷の点では、マルチコア CPU の影響は複数の CPU の影響と同様であるため、システム負荷を考慮する場合は、コンピューターに搭載されている CPU の数と、各 CPU に搭載されているコアの数を考慮する必要があります。次に、システム負荷をコアの総数で割ります。コアあたりの負荷が 1.0 を超えない限り、コンピューターは正常に動作しています。
コンピュータに CPU コアがいくつあるかはどうすればわかりますか?
「cat /proc/cpuinfo」コマンドを使用して CPU 情報を表示できます。 「grep -c 'model name' /proc/cpuinfo」コマンドは、CPU コアの合計数を直接返します。

システムロードに関する経験則

システム負荷にとって 1.0 は理想的な値ですか?

必ずしもそうではありません。システム管理者は余裕を持たせることが多いです。この値が 0.7 に達したら注意が必要です。経験則は次のようになります:

  • システム負荷が継続的に 0.7 を超える場合は、状況が悪化するのを防ぐために、問題がどこにあるかを調査する必要があります。
  • システム負荷が継続的に 1.0 を超える場合は、この値を減らす解決策を見つける必要があります。
  • システム負荷が 5.0 に達すると、システムに重大な問題が発生しているか、長時間応答していないか、クラッシュ寸前であることを意味します。システムがこの値に到達しないようにする必要があります。

私のマシンには 24 個のコアがありますが、適切な負荷はどれくらいでしょうか?

[[email protected] /home/ahao.mah/ALIOS_QA]#grep 'モデル名' /proc/cpuinfo | wc -l24

答えは次のとおりです。

[[email protected] /home/ahao.mah/ALIOS_QA]#echo "0.7*24" |bc16.8

最適な観察時間

最後の質問ですが、「負荷平均」は 3 つの平均値を返します ---- 1 分間のシステム負荷、5 分間のシステム負荷、15 分間のシステム負荷、---- どの値を参照すればよいのでしょうか?

システム負荷が 1 分間だけ 1.0 を超え、他の 2 つの時間帯では 1.0 未満である場合、これは一時的な現象であり、深刻な問題ではないことを示しています。

15 分以内に平均システム負荷が 1.0 を超える場合 (CPU コアの数を調整した後)、問題は一時的な現象ではなく、継続していることを示します。したがって、主に「15 分間のシステム負荷」を観察し、それをコンピューターの正常な動作の指標として使用する必要があります。

以下もご興味があるかもしれません:
  • Linux システムでの CPU 使用率が高い場合のトラブルシューティングのアイデアと解決策
  • Linux で CPU 使用率が高くなる原因をトラブルシューティングするプロセスの詳細な説明

<<:  MySQL インデックスの正しい使い方とインデックスの原理の詳細な説明

>>:  プログレッシブ ウェブ アプリ (PWA) の開発方法

推薦する

Vue で棒グラフを使用し、自分で設定を変更する方法

1. HTMLファイルでechartをインポートする <!-- echarts をインポート ...

JavaScript オブジェクトからプリミティブ値への変換の詳細な説明

目次オブジェクトプロトタイプの値()オブジェクトプロトタイプtoString()シンボル.toPri...

HTML タグに類似: strong および em、q、cite、blockquote

XHTML には似た機能を持つタグがいくつかあります。もちろん、ここでの類似性とは意味の類似性を指...

MySQLの文字セットを変更する方法

1. MySQLの文字セットを確認する '%char%' のような変数を表示します。...

Linux カーネルプログラミングにおけるコンテナの of() 関数の紹介

序文Linux カーネルプログラミングでは、マクロ関数 container_of(ptr, type...

Linux ipcsコマンドの使用

1. コマンドの紹介ipcs コマンドは、Linux のプロセス間通信機能の状態を報告するために使用...

Reactを使用して画像認識アプリを実装する方法

まずは効果の写真をお見せしましょう。 個人的には効果は問題ないと思います。アプリが写真を学習する時間...

vue data が関数である理由をご存知ですか?

公式サイトの説明: コンポーネントを定義する場合、コンポーネントは複数のインスタンスを作成するために...

SQLインジェクションの詳しい解説 - セキュリティ編(第2部)

この記事に誤りがあったり、ご提案がありましたら、お気軽にご連絡ください。よろしくお願いいたします。は...

Dockerコンテナでは、イメージを簡素化してサイズを縮小する方法を詳しく説明しています

目次1.画像レイヤーの数を減らす1. 命令の統合2. 多段階ビルド3. スクワッシュ機能を有効にする...

MySQLにおけるSQLの実行順序についてのちょっとした質問

今日、仕事中に左結合に関するSQLの問題に遭遇しました。後で解決しましたが、この問題を通じてSQLの...

VirtualBoxにOpenSuseをインストールする方法

仮想マシンはホストマシンにインストールされます。 CPU とメモリはホスト マシンと共有する必要があ...

Linux で MySQL データベースのスケジュールされたバックアップを実装する簡単な方法

詳細な手順は次のとおりです。 1. ディスク容量を確認します。 [root@localhost バッ...

react+antd.3x は IP 入力ボックスを実装します

この記事では、IP入力ボックスを実装するための react+antd.3x の具体的なコードを参考ま...

Linux 構成で MySQL データベースへのリモート接続が失敗する問題の解決方法

今日は、Linux でリモート アクセス用に MySQL データベースを構成する方法について質問があ...