こういった疑問はLinuxサーバーの運用管理を始めたエンジニアによく見られます。ロードアベレージは CPU 使用率とは別の指標で、仕組みを知らないまま見ても正しい判断ができません。
この記事では、uptimeコマンドと /proc/loadavg を使ったロードアベレージの確認方法から、数値の読み方・高負荷時の原因特定・対処法まで実サーバーの出力例を交えながら解説します。Rocky Linux 9 / RHEL 9 / Ubuntu 24.04 LTS で動作確認済みです。
・uptimeの3つの数値が何を意味するかわかる
・ロードアベレージの適正値をコア数で判断できる
・高負荷の原因をtop/vmstat/iostatで特定できる
・D状態プロセスとI/O待ちの関係が理解できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
ロードアベレージとは何か
ロードアベレージ(Load Average)とは、CPU の実行を待っているプロセス数の移動平均値です。正確には「実行中(Running)+ 実行待ち(D状態 = Uninterruptible Sleep)のプロセス数」の平均です。CPU 使用率とは異なる点に注意してください。CPU 使用率が 100% でも、ロードアベレージが低い場合は問題ない状況があります。逆に CPU 使用率が低くても、ディスク I/O 待ちのプロセスが多いとロードアベレージが高くなります。
uptimeコマンドでロードアベレージを確認する
1. uptimeコマンドの基本
# uptimeコマンドを実行 $ uptime 10:42:35 up 15 days, 3:21, 2 users, load average: 0.52, 0.48, 0.41 # 出力の読み方: # 10:42:35 - 現在時刻 # up 15 days, 3:21 - 稼働時間(15日3時間21分) # 2 users - ログイン中のユーザー数 # load average: 0.52, 0.48, 0.41 - 1分・5分・15分のロードアベレージ
2. wコマンドでも確認できる
wコマンドはuptimeの情報に加えて、ログイン中のユーザーの詳細を一緒に表示します。$ w 10:42:35 up 15 days, 3:21, 2 users, load average: 0.52, 0.48, 0.41 USER TTY LOGIN@ IDLE JCPU PCPU WHAT pakira pts/0 09:30 0.00s 0.05s 0.01s w admin pts/1 10:20 5:00 0.02s 0.01s -bash
3. ロードアベレージの3つの数値の意味
出力の末尾に並ぶ3つの数値は、過去の異なる時間軸での平均を表しています。・1分間の平均(0.52):直近1分間の状態。急激な変動に敏感
・5分間の平均(0.48):直近5分間の状態。短期トレンドの把握に使う
・15分間の平均(0.41):直近15分間の状態。長期トレンド・ベースライン比較に使う
右から左に向かって値が増えていく(15分 < 5分 < 1分)場合は「負荷が増加中」、逆(1分 < 5分 < 15分)の場合は「負荷が減少中」と読めます。
/proc/loadavgで詳細情報を確認する
1. /proc/loadavgの読み方
/proc/loadavg はカーネルが管理するロードアベレージの生データファイルです。uptimeよりも追加情報が含まれています。$ cat /proc/loadavg 0.52 0.48 0.41 2/458 18923 # 書式: 1分平均 5分平均 15分平均 実行中/全プロセス数 最新PID # 2/458 → 現在実行中(Running/D状態)のプロセスが2、全プロセスが458 # 18923 → 最後に作成されたプロセスのPID
2. シェルスクリプトでロードアベレージを定期記録する
#!/bin/bash # ロードアベレージを5分ごとに記録するスクリプト LOG=/var/log/loadavg.log while true; do echo "$(date '+%Y-%m-%d %H:%M:%S') $(cat /proc/loadavg)" >> $LOG sleep 300 done # または cron で記録する(/etc/cron.d/loadavg に記述) # */5 * * * * root echo "$(date '+%Y-%m-%d %H:%M:%S') $(cat /proc/loadavg)" >> /var/log/loadavg.log
ロードアベレージの判断基準(コア数で考える)
ロードアベレージの適正値は CPU コア数によって異なります。コア数 = 処理できる並列実行数だからです。1. CPUコア数を確認する
# nproc コマンドで論理コア数を確認 $ nproc 4 # lscpu で詳細確認 $ lscpu | grep -E "^CPU(s)|^Thread|^Core|^Socket" CPU(s): 4 Thread(s) per core: 2 Core(s) per socket: 2 Socket(s): 1 # → 物理コア 2、ハイパースレッディングで論理コア 4
2. ロードアベレージの目安
4コアのサーバーの場合、ロードアベレージの目安は以下のとおりです。・0 ~ 4:正常範囲。コア数以下なので余裕がある
・4 ~ 8:注意が必要。処理を待っているプロセスが発生している
・8以上:高負荷。原因を特定して対処が必要
ロードアベレージがコア数の2倍以上になると、ユーザーに体感できるほどの遅延が発生することが多いです。
高負荷時の原因特定:topとvmstatとiostat
1. topコマンドで高CPU消費プロセスを特定する
# top コマンド起動(q で終了) $ top top - 10:42:35 up 15 days, 3:21, 2 users, load average: 3.52, 2.48, 1.41 Tasks: 458 total, 3 running, 455 sleeping, 0 stopped, 0 zombie %Cpu(s): 78.5 us, 5.2 sy, 0.0 ni, 14.0 id, 2.3 wa, 0.0 hi, 0.0 si MiB Mem : 7832.0 total, 1200.4 free, 4500.2 used, 2131.4 buff/cache MiB Swap: 2048.0 total, 1500.0 free, 548.0 used. 3100.0 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 18923 apache 20 0 480000 80000 12000 R 95.3 1.0 5:23.45 httpd 18930 mysql 20 0 2000000 500000 20000 R 82.1 6.4 10:15.33 mysqld # %CPU が高いプロセスを特定 # wa (I/O wait) の値が高い場合はディスクI/Oが原因
2. vmstatでCPUとメモリの状態を確認する
# 1秒ごとに5回表示 $ vmstat 1 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 2 560000 50000 30000 200000 0 5 100 500 1200 2300 75 5 18 2 0 2 1 560000 48000 30000 200000 0 0 50 300 1100 2100 70 4 22 4 0 ... # r = 実行待ちプロセス数(ロードアベレージに近い数字) # b = D状態(I/O待ち)のプロセス数 # wa = I/O wait(高い場合はディスクI/Oがボトルネック) # si/so = スワップイン/アウト(値があればメモリ不足)
3. iostatでディスクI/Oを確認する
# sysstat パッケージが必要 $ sudo dnf install -y sysstat # RHEL/Rocky Linux $ sudo apt install -y sysstat # Ubuntu # 1秒ごとに5回表示 $ iostat -dx 1 5 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %util nvme0n1 50.0 200.0 1600.0 8000.0 0.0 5.0 85.3 sdb 0.5 10.0 20.0 400.0 0.0 0.0 5.2 # %util が高いデバイスがI/Oボトルネック # rkB/s, wkB/s でどちらが主原因か判断
高負荷時のトラブルシュート
「ロードアベレージは高いがCPU使用率は低い」場合
この状況はディスク I/O 待ち(D状態のプロセス)が原因の場合がほとんどです。# D状態のプロセスを確認 $ ps aux | awk '$8 == "D" {print}' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 18930 8.2 6.4 2000000 500000 ? D 09:00 10:15 mysqld # 上記のように mysqld が D状態なら、DBのディスクI/Oが原因 # iostat で対象デバイスの %util を確認 $ iostat -dx 1 3 | grep -v "^$\|^Device" nvme0n1 50.0 500.0 1600.0 20000.0 0.0 20.0 99.5
「ロードアベレージが急激に上昇した」場合
# sar コマンドで過去のロードアベレージ推移を確認(sysstatが必要) $ sar -q 1 10 Linux 5.14.0-427.16.1.el9_4.x86_64 10:30:00 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 10:30:01 0 458 0.52 0.48 0.41 0 10:30:02 3 460 0.75 0.50 0.42 2 10:30:03 8 465 1.80 0.72 0.45 5 # 急上昇の直前に何が起きたかをログで調査 $ sudo journalctl --since "10 minutes ago" | grep -iE "error|warn|oom|kill"
ゾンビプロセスがロードアベレージを上げている場合
ゾンビプロセス(Z状態)はロードアベレージには影響しませんが、大量に存在する場合は親プロセスに問題があることを示します。# ゾンビプロセスを確認 $ ps aux | awk '$8 == "Z" {print}' # ゾンビの親プロセスを特定して再起動 $ ps -ef | awk '$8 == "Z" {print $3}' | sort -u | xargs ps -p
w コマンドでログインユーザーとロードアベレージを一括確認する|chsh によるログインシェル変更も
ここからはロードアベレージと併せて確認しておきたい関連コマンドを整理します。uptime と並んでロードアベレージを表示するのが w コマンドです。w は1行目に uptime 相当の情報(現在時刻・稼働時間・ログインユーザー数・ロードアベレージ)を出し、2行目以降に各ログインユーザーの詳細を並べてくれます。「誰が今ログインしていて、どこから接続していて、何を実行中か」までを1コマンドで把握できる点が便利です。
# 現在のログインユーザーとロードアベレージを同時に確認する
$ w
14:32:15 up 12 days, 3:21, 3 users, load average: 0.42, 0.38, 0.31
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.0.2.10 12:05 1.00s 0.05s 0.05s w
tomohiro pts/1 192.0.2.11 09:14 2:30 0.30s 0.30s -bash
mysql pts/2 192.0.2.12 Tue08 1day 0.00s 0.00s sleep 60
ユーザーが普段使うログインシェルを変更したいときは chsh コマンドです。本人が自分のシェルを変える場合は引数なし、root が別ユーザーのシェルを変える場合は -s オプションで明示します。
# 自分のログインシェルを bash に変更する
$ chsh -s /bin/bash
# root が tomohiro のログインシェルを bash に変更する
# chsh -s /bin/bash tomohiro
# 設定可能なシェル一覧を確認する(/etc/shells に記載されたものしか指定不可)
$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
私も新サーバーを払い出した直後、デフォルトが sh になっていて補完が効かず、手が動かなくなりました。chsh -s /bin/bash を1行打って再ログインすれば、矢印キー履歴と Tab 補完が戻ってきます。設定変更は次回ログインから反映される点だけ注意してください。
本記事のまとめ
| 確認したいこと | コマンド |
|---|---|
| ロードアベレージを確認する | uptime または w |
| 実行中プロセス数も確認する | cat /proc/loadavg |
| CPUコア数を確認する | nproc |
| 高CPU消費プロセスを特定する | top(%CPU列でソート) |
| I/O待ちプロセスを確認する | vmstat 1 5(b列・wa列) |
| ディスクI/Oボトルネックを特定する | iostat -dx 1 5 |
| 過去のロードアベレージ推移を確認する | sar -q 1 10 |
関連記事として「LinuxのDNS設定の基本」や「Linuxの主要な設定ファイルの場所と内容まとめ」も合わせてご覧ください。
Linuxのシステム管理を体系的に学びませんか?
ロードアベレージの読み方が分かると、サーバーの負荷状況を正確に把握して適切に対処できます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:ファイル名に日付を付けてリネームする方法|date +%Y%m%dとmv・cpの実践例
- 前のページへ:Linuxのrsyslogでログ出力先とレベルを設定する方法|/etc/rsyslog.confの書き方を解説
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます