uptimeコマンドによる負荷確認
Linuxシステムのレスポンスが悪化した際、まず実行するのがtopやuptimeコマンドです。これらにより、システムの現在の負荷状況を迅速に把握できます。
$ uptime
14:20:05 up 12 days, 3:15, 2 users, load average: 1.15, 0.85, 0.50
出力結果の末尾にある「load average」の3つの数値は、それぞれ過去1分間、5分間、15分間の平均負荷を示しています。これらの推移を見ることで、負荷の傾向を判断できます。
- 上昇傾向:1分間の数値が15分間の数値より大きい場合、負荷が増加しています。
- 下降傾向:1分間の数値が15分間の数値より小さい場合、負荷はピークを過ぎて減少しています。
- 安定:3つの数値に大きな差がない場合、負荷は一定の状態で推移しています。
平均負荷の正体
平均負荷を「CPU使用率」と同じものだと誤解されることがありますが、厳密には異なります。平均負荷とは、単位時間あたりに実行可能状態(Running)または割り込み不可のスリープ状態(Uninterruptible Sleep)にあるプロセスの平均数、すなわち「アクティブなプロセス数」を指します。
- 実行可能状態:CPUを使用中、または実行権限が回ってくるのを待っている状態(psコマンドで
Rと表示)。 - 割り込み不可状態:主にディスクI/Oなどのハードウェア応答を待っている状態(psコマンドで
Dと表示)。システムの重要な処理中であり、途中で中断できません。
つまり、平均負荷は「処理を待っているタスクがどれだけ溜まっているか」という行列の長さを示していると言えます。
負荷の適正値を見極める
平均負荷の数値を評価するには、システムの論理CPU数を知る必要があります。以下のコマンドで確認可能です。
# 論理CPUコア数を直接表示
$ nproc
4
# または詳細情報を確認
$ lscpu | grep "^CPU(s):"
CPU(s): 4
例えば、CPUが4つのシステムで平均負荷が「2.0」であれば、リソースの50%を使用している計算になります。逆に、1CPUのシステムで「2.0」であれば、処理能力の倍のタスクが滞留していることになります。一般的に、CPU数に対して70%を超える負荷が継続する場合は、調査やチューニングを検討すべきタイミングです。
平均負荷とCPU使用率の違い
平均負荷には「CPUを待っているプロセス」だけでなく「I/Oを待っているプロセス」も含まれる点が重要です。
- CPU集約型プロセス:計算処理が多いため、CPU使用率と平均負荷がどちらも高くなります。
- I/O集約型プロセス:ディスク読み書きの待機(iowait)が発生するため、CPU使用率は低くても平均負荷が高くなることがあります。
- 大量のプロセス実行:プロセススケジューリングのオーバーヘッドにより、CPU使用率・平均負荷ともに上昇します。
負荷原因を特定する分析ツール
負荷が高い原因がCPUにあるのか、あるいはI/Oにあるのかを切り分けるには、mpstatやpidstatが有効です。
1. mpstatによるCPU全体の状態確認
# 2秒間隔で全CPUの統計を表示
$ mpstat -P ALL 2
Linux 5.15.0 (node1) 2023/10/27 _x86_64_ (2 CPU)
14:30:05 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
14:30:07 all 85.50 0.00 10.20 0.10 0.00 0.20 0.00 0.00 4.00
14:30:07 0 84.00 0.00 11.00 0.10 0.00 0.30 0.00 0.00 4.60
14:30:07 1 87.00 0.00 9.40 0.10 0.00 0.10 0.00 0.00 3.40
この例では%usrが非常に高く、ユーザーアプリケーションによる演算処理が負荷の主因であることがわかります。もし%iowaitが高い場合は、ディスクやネットワークのボトルネックを疑います。
2. pidstatによるプロセス特定
どのプロセスが負荷をかけているかは、pidstatで確認します。
# 2秒間隔でCPU使用率の高いプロセスを表示
$ pidstat -u 2 3
Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 1234 75.00 15.50 0.00 2.50 90.50 1 heavy-app
Average: 0 567 2.00 5.00 0.00 1.00 7.00 0 sys-daemon
ここではPID 1234の「heavy-app」がCPUを大量に消費していることが明確になります。このように、平均負荷を入り口として詳細なコマンドを組み合わせることで、システムトラブルの根本原因へとアプローチできます。