Linuxのロードアベレージを確認・理解する方法|uptimeとwの出力と高負荷時の原因特定

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > Linuxのロードアベレージを確認・理解する方法|uptimeとwの出力と高負荷時の原因特定
「サーバーが重くなっているが、どのコマンドでロードアベレージを確認すればいいか分からない」「uptimeの出力に並んでいる3つの数字の意味が理解できていない」

こういった疑問はLinuxサーバーの運用管理を始めたエンジニアによく見られます。ロードアベレージは CPU 使用率とは別の指標で、仕組みを知らないまま見ても正しい判断ができません。

この記事では、uptimeコマンドと /proc/loadavg を使ったロードアベレージの確認方法から、数値の読み方・高負荷時の原因特定・対処法まで実サーバーの出力例を交えながら解説します。Rocky Linux 9 / RHEL 9 / Ubuntu 24.04 LTS で動作確認済みです。

【この記事でわかること】
・uptimeの3つの数値が何を意味するかわかる
・ロードアベレージの適正値をコア数で判断できる
・高負荷の原因をtop/vmstat/iostatで特定できる
・D状態プロセスとI/O待ちの関係が理解できる

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

ロードアベレージとは何か

ロードアベレージ(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

「実行中/全プロセス数」の部分は特に有用で、CPU を待っているプロセスが実際にいくつあるかを把握できます。

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
ロードアベレージはCPUコア数と比較して判断することが基本です。uptime で3つの数値を確認し、高負荷であれば top / vmstat / iostat を組み合わせて原因を特定してください。D状態のプロセスが多い場合はディスクI/Oが原因であることがほとんどです。

関連記事として「LinuxのDNS設定の基本」や「Linuxの主要な設定ファイルの場所と内容まとめ」も合わせてご覧ください。

Linuxのシステム管理を体系的に学びませんか?

ロードアベレージの読み方が分かると、サーバーの負荷状況を正確に把握して適切に対処できます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。