LinuxのCPUステートを理解する

BY Derek Haynes

March 20, 2019

Linuxサーバが遅いときは、通常topコマンドを使用してCPUの測定結果を表示します。

undefined

しかしこの2文字の略語は何を意味しているのでしょうか?

undefined

(なんて意味?)



3つのCPUステート

 少し立ち戻ると、CPUには3つのステートがあります。

アイドル、CPUが何もしていない状態を指します。

ユーザ空間プログラムの実行、例えば、コマンドシェル、メールサーバ、コンパイラなどです。

カーネルの実行、割り込み処理のサービスや、リソースの管理などです。

 上記のように3つに大別されるステートは、さらに細かく分類することができます。例えばユーザ空間で実行されているプログラムは、初期優先度で実行されているものか、nice値を元に決定した優先度で実行されているものに分けられます。niceとはプロセスの実行優先度を調整する方法で、プロセスの実行頻度を下げたりすることができます。Nice値は-20(最も優先度が高い)から19(最も優先度が低い)の範囲です。 デフォルトでは、Linux上のプロセスはNice値0で起動します。niceについての詳細は、本ブログの、"Restricting process CPU usage using nice, cpulimit, and cgroups for more information on nice" (「nice」、「cpulimit」、「cgroups」コマンドでCPUの負荷を制限する)をご覧ください。

7つのCPU統計

 CPU統計を表示するには様々な方法がありますが、topコマンドを使用するのが最も一般的でしょう。

 topコマンドを実行するには、コマンドラインでtopと入力するだけです。

 topコマンドの出力は2つの部分に分けられます。最初の数行は、タスク数、CPU統計、現在のメモリ使用量の内訳を含むシステムリソースの概要です。その下には、実行中のプロセスのリストが表示されます。PID、CPU使用率、メモリ使用率などでソートできます。

CPUの行は、例えば下のように見えます。

%Cpu(s): 24.8 us,  0.5 sy,  0.0 ni, 73.6 id,  0.4 wa,  0.0 hi,  0.2 si,  0.0 st

24.8 us usこれはプロセッサ(CPU)がユーザ空間プロセスを実行するのに24.8%の時間を使っていることを示しています。ユーザ空間プログラムは、カーネルに属していないプロセスです。 シェル、コンパイラ、データベース、Webサーバ、デスクトップに関連するプログラムは全てユーザ空間プロセスです。プロセッサがアイドル状態でない時は、たいてい、大部分のCPU時間がユーザ空間プロセスの実行に使われているでしょう。

73.6 id id他の統計の説明はしばらくの間飛ばします。後で触れるので少しお待ちください。この「id」の統計は、最終サンプリング期間中に、プロセッサがアイドル状態だった時間が、73%以上だったことを示しています。 今回のケースのように、ユーザー空間のパーセンテージus、niceのパーセンテージni、アイドルのパーセンテージidの合計は100%に近いはずです。CPUが他のステートに多くの時間を使っている場合は、何かがおかしいです。下のトラブルシューティングを参照してください。

0.5 sy syこれは、CPUがカーネルの実行に使った時間です。 全てのプロセスとシステムリソースはカーネルによって処理されます。 ユーザ空間プロセスがシステムから何かを必要とするとき、カーネルは実行中です。例えばメモリの割り当て、I/Oの実行、子プロセスの作成、などです。実はスケジューラ自体もカーネルの一部で、どのプロセスを次に実行するかを決定します。カーネルで使われる時間はできるだけ少なくするべきです。 今回のケースの場合、様々なプロセスのために、カーネル処理が使用したCPU時間はわずか0.5%ですが、特に多くのI/Oが発生しているとき、はるかに高くなることがあります。

0.0 ni すでに触れたとおり、ユーザ空間プロセスの優先度は、nice値を調整して細かく変更することができます。niの統計は、niceで調整されたユーザ空間プロセスに、どのくらいCPU時間が使われたかを示しています。 niceで調整されたプロセスがシステム上にない場合、値は0になります。

0.4 wa ディスクの読み書きなどのI/Oオペレーションは、CPUの速度と比べると低速です。I/Oオペレーションは、人間の日々の活動と比較すれば、はるかに高速ですが、それでもCPUのパフォーマンスと比較すると遅いのです。プロセッサは読み取りや書き込みを開始して、結果を待たなければないため、細々とした処理時間がありますが、それ以外は何もしていません。 つまり言い方を変えれば、I/Oオペレーションの完了を待つ間はアイドル状態です。 CPUがこのステートで使った時間は、waの統計によって示されます。

0.0 hi & 0.2 si この2つの統計は、プロセッサが割り込み処理に使った時間を示しています。 hiはハードウェア割り込み、siはソフトウェア割り込みです。 ハードウェア割り込みは、ディスクやネットワークインターフェイスなど様々な周辺機器からCPUに物理的に送信される信号による割り込みです。 ソフトウェア割り込みは、システム上で実行されているプロセスから発生します。 ハードウェア割り込みは、CPUが行っている処理を停止し、割り込みを処理させます。 ソフトウェア割り込みはCPUレベルではなく、カーネルレベルで発生します。

0.0 st最後の統計値は、仮想マシンにのみ適用されます。 Linuxがハイパーバイザー上の仮想マシンとして実行されている場合、st(stolenの略)の統計は、仮想CPUが、ハイパーバイザが他の仮想CPUをサービスしている間、どれくらい待ち時間があったかを示します。他の仮想CPUとは別の仮想マシン上にある仮想CPUのことです。実際にはこれらの仮想プロセッサは同じ物理プロセッサを共有しているので、仮想マシンが時間を使いたくても、ハイパーバイザが別の仮想マシンをスケージュールしている時間があるでしょう。

Scoutを使ってCPUステートをモニターする

 Scoutはデフォルトでは自動で主要なCPUステートをモニターするので、時系列でどのように変化したかを知ることができます。Scoutのリアルタイム・モードは素晴らしいです。グラフの表示で、ターミナル内で変化する値を眺めるより、より直感的に把握できます。



(動画)

とても簡単に多数のサーバの統計値を比較することができます。

cpu_across_servers.png

(リンク切れ)

Scoutは30日間無料で試用できます

トラブルシューティング

 処理の多いサーバやデスクトップPCでは、CPUがアイドル状態に使う時間は少ないはずです。しかし、システムにアイドル時間がほとんどない場合、a)過負荷(この場合もっと良いCPUが必要です)もしくは b)何か問題があるかです。

 ここでは、パフォーマンス低下をもたらす諸問題と、それがCPU使用率に与える影響について簡単に説明します。

ユーザーモードの高負荷

 システムの状態が、CPUサイクルに余裕があった状態から、突然余裕がなくなってしまった、というような急激な変わり方をした場合、まずユーザ空間プロセスが、どれくらいCPU時間を使っているかを確認しましょう。もし負荷が高ければ、あるプロセスに不具合が起き、CPU時間をすべて消費してしまったことを意味します。topコマンドを使って、どのプロセスが原因か調べて、サービスを再起動するか、プロセスをKillすることができるでしょう。

undefined

カーネルの高使用率

 これは許容範囲の場合もあります。 例えば、コンソールI/Oを多く実行するプログラムで、カーネルの使用率が短期間に急上昇するかもしれません。 しかし、長期間高いままなら、何かが間違っているのかもしれません。 高負荷の原因として考えられるのは、ドライバやカーネルモジュールの問題です。

高いnice値

 nice値によって優先度をつけられたプロセスに割かれているCPU時間が、急激に上昇した場合、システム上で誰かが高負荷のCPUジョブを開始したことを意味します。しかもそのタスクはniceで調整されたものです。

 もしnice値が0より大きければ、プロセスの優先順位は十分低いので、CPUの過負荷を避けることができます。これは良心的な使い方です。何かをする必要はほとんどないでしょう。誰がプロセスを起動したか探して、何が出来るか話し合うことはできるかもしれませんが!

 しかし、ナイス値が0未満のタスクの場合、システムの応答性を容易に損なうことがあるため、何が起きていて、誰が起こしたのか、調べる必要があります。

I/O待機時間が長い

 システム上で集中的にI/Oタスクが実行されていて、CPU時間があまり消費されていないことを意味します。値が短期間で収まらず、ずっと高い場合は、タスクによって実行されたI/Oが非常に非効率的であるか、データが非常に遅いデバイスに転送されているか、ハードディスクに潜在的な問題があり、読み取りと書き込みを処理するのに長い時間がかかっていることを意味しています。




高負荷の割り込み処理

 壊れた周辺機器が大量のハードウェア割り込みを引き起こしているか、大量のソフトウェア割り込みを発生しているプロセスがある可能性を示唆しています。

大きい「st(stolen time)」値

 基本的に、ハイパーバイザーを実行しているホストシステムが過負荷であることを意味します。 可能であれば、ハイパーバイザーで実行されている、他の仮想マシンを確認して、別のホストに移行してください。

まとめ

 Linuxは、CPUが様々なタスクの実行に使った時間を統計として保持しています。大部分はユーザー空間で実行されているプログラムに使用されるか、アイドル状態ですが、他にもカーネルや、割り込み処理などの実行状態があります。これらの状態をモニターすれば、システムの健全性や円滑な動作を維持する役に立ちます。