🐧 Linux 総合学習プラットフォーム
プロセス監視/障害対応 ・ 中級

リソース監視(CPU・メモリ・負荷)

サーバが重いと感じたら、まずCPU・メモリ・負荷の3点を見ます。uptime や top でロードアベレージを確認し、CPUコア数を超えて高止まりしていれば処理が詰まっています。free でメモリと空き容量、スワップの使用量を見て、メモリ不足の兆候がないか確かめます。vmstat を数秒間隔で流すと、CPU待ち・I/O待ち・スワップの動きが時系列でつかめ、どこが詰まっているかの当たりが付きます。

「サーバが重い」「アプリの反応が遅い」――運用でいちばんよく出会うのが、この相談だ。

難しいのは、『重い』と一口に言っても中身がまるで違うことだ。計算が忙しいのか、メモリが足りないのか、ディスクの読み書き待ちなのか。原因がまったく異なれば、対処も変わる。

そこで重さを感じたら、まずはCPU・メモリ・負荷という3つの観点から全体像をつかみ、どこが詰まっているか(ボトルネック)の当たりを付ける。

💡
ポイント「重い」の正体はCPU・メモリ・I/Oのどれか。いきなり個別を疑う前に、まずこの3点で全体像をつかむと方向を外さない。

いきなり個別のプロセスを疑う前に、この3点をざっと見ておく。そうすると、調査の方向を大きく外さずに済む。

CPU計算が忙しいus/sy が高いメモリ足りないavailable 枯渇 / Swap増I/O読み書き待ちwa が高いロードアベレージで混み具合を見て、どれが詰まっているかを切り分ける

📊 ロードアベレージが語る数字

最初の手がかりがロードアベレージ(負荷平均)だ。これは「実行したいのに待たされているタスクが平均で何個あったか」を表す数値で、システム全体の混み具合の目安になる。

uptime を打つと、行末に load average: 0.52, 0.48, 0.45 のように3つの数字が出る。これは左から順に、過去1分・5分・15分の平均値だ。

uptime ……行末の load average: 0.52, 0.48, 0.45 は左から1分・5分・15分の平均。直近と過去を比べて増減の向きが読める。

直近1分が大きく、15分が小さければ「今まさに混み始めた」、逆なら「混雑が収まりつつある」と、時間変化まで読める。top や htop の画面上部でも同じ値を確認できる。

だが、この数字だけを眺めても「高いのか低いのか」は判断できない。

ロードアベレージを読むときの勘どころは、CPUのコア数と比べることだ。値がコア数とほぼ同じなら「ちょうど使い切っている」状態、コア数を大きく超えて高止まりしていれば「処理しきれずタスクが渋滞している」状態だ。

4コアのサーバで読むとload 2.0(余裕あり)コア数の半分。まだ空きがあるload 8.0(渋滞)コア数の倍。順番待ちが発生中コア数は nproc で確認。値をコア数と比べて読む

コア数は nproc コマンドや、grep -c processor /proc/cpuinfo で確認できる。

たとえば4コアのサーバでロードアベレージが常時8や10なら、明らかに過負荷で、各タスクが順番待ちで待たされている状態だ。逆に8コアでロードアベレージが2程度なら、まだ十分に余裕があると判断できる。

ただしロードアベレージは、CPUの忙しさだけでなくディスクI/O待ちのタスクも数に含める。そのため「値は高いのにCPU使用率は低い」こともある。その場合はCPUではなくI/Oやスワップが原因と読み替える。

つまずきロードアベレージにはI/O待ちのタスクも含まれる。「値は高いのにCPUは暇」なら、犯人はCPUではなくI/Oやスワップだ。

🖥 CPUとメモリの内訳を top で見る

全体の混み具合が分かったら、その中身を top で見る。top は画面を一定間隔で更新し続け、負荷の高いプロセスが上位に並ぶよう自動で並び替わる。

画面上部の %Cpu(s) の行には、CPU時間の内訳が us(ユーザプログラム)、sy(カーネル)、id(アイドル=空き)、wa(I/O待ち)などのパーセンテージで表示される。

%Cpu(s): 12.0 us3.0 sy80.0 id5.0 waus/sy が高い計算そのものが重い=CPUがボトルネックid が低く wa が高いCPUは暇なのにディスク待ちで詰まる

us と sy が高ければ計算そのものが重く、id が低くて wa が高ければ、CPUは暇なのにディスクの読み書き待ちで詰まっている、と読み分けられる。

コツ色付きでコアごとの使用率が並ぶ htop が入っていれば、そちらのほうが状況をつかみやすい。top で物足りなければ試す価値がある。

より見やすく、色付きでコアごとの使用率も並ぶ htop が入っていれば、そちらを使うとさらに状況をつかみやすくなる。

🧠 free の数字は、少なくても慌てるな

メモリの状況は free で確認する。free -h と人間に読みやすい単位を付けて実行すると、total(総量)・used(使用中)・free(完全な空き)・available(実際に割り当て可能な量)が表形式で出る。

free -h ……total/used/free/available を読みやすい単位で表示。余裕の判断は free ではなく available の値で行う。

ここで初学者がつまずきやすいのが、free の値が小さくても慌てなくてよいという点だ。

Linuxは空きメモリをディスクキャッシュ(buff/cache)として有効活用する。そのため free が少なく見えるのは、正常な動作なのだ。

つまずきfree(完全な空き)が小さくても慌てない。Linuxは空きメモリをキャッシュに回しているだけ。本当の余裕は available で見る。

メモリに本当に余裕があるかは、free ではなく available の値で判断する。available が十分にあれば、まだ余裕がある。

本当に注意すべきはスワップだ。スワップとは、物理メモリが足りなくなったときに、その一部をディスク上の領域へ一時的に退避させる仕組みである。

物理メモリ速い足りなくなると…ディスク(スワップ)桁違いに遅い一部を退避出し入れ頻発スワップ多発=スラッシング。全体が極端に遅くなる

free の Swap 行の used が増え続けていたら、メモリ不足の危険信号だ。

ディスクはメモリより桁違いに遅い。だからスワップが多発すると、メモリとディスクの間でデータの出し入れが頻発し、システム全体が極端に遅くなる(スラッシングと呼ばれる状態)。

「ロードアベレージは高いのにCPUは暇」「全体がもっさり遅い」というときは、このスワップの多発を真っ先に疑う。

🎞 「動き」を見たいときの vmstat

瞬間値だけでは分からない「動き」を見たいときは vmstat が便利だ。vmstat 1 のように秒数を引数で渡すと、1秒ごとに1行ずつ統計を出力し続ける。

vmstat 1 ……1秒ごとに1行ずつ統計を出力。1行目は起動からの平均なので、今の動きは2行目以降を読む。

注目する列は次のとおりだ。procs の r(実行待ちのプロセス数)と b(I/O待ちでブロックされた数)。swap の si/so(スワップの読み込み・書き出し量。ここが常に0でなくなったらスワップ多発のサイン)。io の bi/bo(ディスクの読み書き量)。cpu の us/sy/id/wa。

たとえば wa が高く bi/bo も大きければI/Oがボトルネック、si/so が増えていればメモリ不足、r が常にコア数を超えていればCPU不足、というように読む。複数の指標を時系列で突き合わせることで、詰まっている場所をかなり正確に絞り込める。

🧰 3つの道具を重ねる

実際の調査では、これらを順に重ねる。

まず uptime か top でロードアベレージを見て混み具合を把握する。そして、CPUが原因か(top の us/sy が高い)、メモリが原因か(free の available が枯渇・Swap が増加)、I/Oが原因か(top の wa が高い)を切り分ける。

コツvmstat 1 の1行目は起動からの平均値。今この瞬間の動きを知りたいなら、必ず2行目以降を読むのがコツだ。

確証が欲しいときは vmstat 1 を数十秒流して、どの指標が異常かを時系列で確認する。1行目は起動からの平均値なので、実際の今の動きは2行目以降を読むのがコツだ。

ここまでで「何が」ボトルネックかが見えたら、次のステップで「どのプロセスが」その資源を食っているのかを特定する、という流れに進む。

この全体俯瞰を最初に挟むかどうかで、その後の調査の速さと正確さが大きく変わる。

この項目に出てくる用語

ロードアベレージろーどあべれーじ
実行待ちを含む処理の混み具合を示す数値。1・5・15分平均で表示される。
ボトルネックぼとるねっく
全体の性能を律速している最も詰まっている箇所。
スワップすわっぷ
物理メモリが足りないとき一部をディスクへ退避する領域。

関連コマンド

uptimetophtopfreevmstat

▶ 学習アプリでこの続きを学ぶ・演習する