昔、まだVPSサーバーなんかをつかっていたころサーバーが重くてダウンし、その原因を探るなんてやっておりました。
いまだとモニタリングツールから一括でこれらを見ることが一般的でしょうし、サーバーに入ってコマンドを打つということは減ってきていると思いますが、昔の知識の復習も兼ねてまとめておきます。
Step 1: まず全体の状態を確認
ロードアベレージをチェック
$ uptime
14:23:01 up 10 days, 3:42, 2 users, load average: 2.50, 1.80, 1.45
判断方法:
# CPUコア数を確認
$ nproc
4
# ロードアベレージ ÷ コア数で判断
# 2.50 ÷ 4 = 0.625 → 問題なし
# 4.00 ÷ 4 = 1.0 → やや高い
# 8.00 ÷ 4 = 2.0 → 高負荷
目安:
- 1.0未満: 余裕あり
- 1.0〜2.0: 注意
- 2.0以上: 高負荷(要調査)
Step 2: 原因を切り分ける
パターン① ロードアベレージが低いのに遅い
→ ネットワークが原因の可能性
# 接続数を確認
$ netstat -an | grep ESTABLISHED | wc -l
# 状態別に集計
$ netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c
よくある問題:
- 接続数が異常に多い(数千〜数万)
- CLOSE_WAIT が大量に残っている
パターン② ロードアベレージが高い
→ CPU / メモリ / ディスクI/O のどれかが原因
$ top
topの見方:
%Cpu(s): 25.0 us, 5.0 sy, 0.0 ni, 60.0 id, 10.0 wa
↑ ↑ ↑ ↑
ユーザー システム 空き時間 I/O待ち
Step 3: 原因別の詳細調査
ケース A: CPU使用率が高い(us + sy が 70%以上)
# CPU使用率の高いプロセスを確認
$ ps aux --sort=-%cpu | head -10
# 詳細を見る
$ top
# 表示中に「P」キーでCPU順にソート
対策:
- 重いプロセスを特定して最適化
- 不要なプロセスを停止
- サーバー増強を検討
ケース B: I/O待ちが多い(wa が 20%以上)
# ディスクの状態を確認
$ iostat -x 1
重要な指標:
-
%util: 80%以上なら要注意 -
await: 20ms以上なら遅い
# どのプロセスがI/Oを使っているか
$ iotop
対策:
- データベースのクエリを最適化
- ログ出力を減らす
- SSDに変更を検討
ケース C: メモリ不足(Swapが使われている)
$ free -h
total used free shared buff/cache available
Mem: 7.6G 5.1G 445M 12M 2.1G 1.9G
Swap: 2.0G 512M 1.5G
↑
これが多いと危険
Swapが500MB以上使われている場合:
# メモリ使用率の高いプロセスを確認
$ ps aux --sort=-%mem | head -10
# スワップの入出力を監視
$ vmstat 1
# si(スワップイン)とso(スワップアウト)が継続的に発生していたら危険
対策:
- メモリを食っているプロセスを特定
- 設定を見直して使用量を削減
- メモリ増設を検討
簡単フローチャート
[サーバーが重い]
↓
uptime でロードアベレージ確認
↓
┌───┴───┐
低い 高い
│ │
│ top で確認
│ │
│ ┌──┴──┐
│ CPU高い wa高い Swap使用
│ │ │ │
│ CPU調査 I/O調査 メモリ調査
│
netstat で確認
よく使うコマンドまとめ
| コマンド | 用途 | 見るポイント |
|---|---|---|
uptime |
負荷の全体確認 | load average の値 |
top |
リアルタイム監視 | CPU使用率、メモリ、wa |
ps aux --sort=-%cpu |
CPU使用率順 | どのプロセスが重いか |
ps aux --sort=-%mem |
メモリ使用率順 | どのプロセスがメモリを使っているか |
free -h |
メモリ状況 | Swap使用量 |
iostat -x |
ディスクI/O | %util、await |
netstat -an |
ネットワーク接続 | 接続数、状態 |
vmstat 1 |
総合監視 | si/so(スワップ)、r(待ちプロセス) |
調査の基本ルール
- まず全体を見る: uptimeとtopで状況把握
- 原因を絞る: CPU/メモリ/I/O/ネットワークのどれか
- プロセスを特定: psコマンドで犯人を見つける
- 対策する: 最適化 or リソース追加
ポイント: 一度に全部見ようとせず、順番に調べていくことが大事です。
すぐに使える調査テンプレート
サーバーが重いと言われたら、まずこれを実行:
# 1. 全体確認
uptime
top -n 1
# 2. CPU確認
ps aux --sort=-%cpu | head -10
# 3. メモリ確認
free -h
ps aux --sort=-%mem | head -10
# 4. ディスク確認
iostat -x 1 3
# 5. ネットワーク確認
netstat -an | grep ESTABLISHED | wc -l
この結果を見れば、だいたいの原因がわかります。