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) の開発方法

推薦する

MySQL のマスタースレーブレプリケーションと読み取り書き込み分離の原理と使用法の詳細な説明

この記事では、例を使用して、MySQL マスター/スレーブ レプリケーションと読み取り/書き込み分離...

Dockerイメージを構築する2つの方法

目次既存のイメージからイメージを更新します。イメージを最初から構築する: Docker イメージ リ...

JavaScript はクリックして画像の形状を変更する (変換アプリケーション) を実装します。

JavaScriptをクリックすると画像の形状が変わります(変形の応用)。参考までに具体的な内容は...

ページングのどのページでMySQLのレコードをクエリするか

序文実際には、次のような問題に遭遇する可能性があります。特定のレコードの ID がわかっていて、その...

「いいね!」文がインデックスに登録されないのはなぜですか?

序文この記事は、最も人気のある言語で最も退屈な基礎知識を説明することを目的としていますこのトピックは...

Nginx ロケーション設定のチュートリアル (ゼロから)

基礎位置の一致順序は、「最初に正規表現に一致し、次に共通表現に一致」です。実際のロケーションの一致順...

VMware15.5 インストール Ubuntu20.04 グラフィック チュートリアル

1. インストール前の準備1. 公式ウェブサイトからUbuntu 20.04のイメージファイルを直接...

MySQL データベースの基本的な SQL ステートメントの概要

この記事では、例を使用して、Mysql データベースの基本的な SQL ステートメントについて説明し...

バックエンドの権限に基づいてナビゲーション メニューを動的に生成する Vue-router のサンプル コード

目次js の1. グローバルガードを登録する2. Vuex 状態管理グローバルキャッシュルート3. ...

HTML 縦列表示テキストを使用してテキストを縦列で表示します

コードをコピーコードは次のとおりです。 <span style='display:bl...

ウェブ音楽プレーヤーを実現する js

この記事では、参考までに簡単なHTMLと音楽プレーヤーの制作コードを紹介します。具体的な内容は以下の...

Raspberry PiにDockerをインストールする方法

Raspberry Pi は ARM アーキテクチャをベースとしているため、Docker のインスト...

MySQL 5.7 mysql コマンドラインクライアントの使用コマンドの詳細

MySQL 5.7コマンドを使用するMySQLコマンドラインクライアント1. パスワードを入力してく...

...

HTML ページをズームアウトした後にスクロール バーを表示するためのサンプル コード

ここでは、HTML ページのサイズを縮小した後に下部にスクロール バーを表示し、スクロール バーをス...