ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Linuxサーバー

Linux サーバー監視入門:CPU・メモリ・ディスク I/O・帯域使用量の確認(top・iostat・iftop・vnstat)

7 ステップ 12 分で読めます 4 回閲覧 0
目次

サイトが遅い、SSH が重い、トラフィックが急増した――そんなときはまずボトルネックを特定することが大切です。この記事では実用的な Linux サーバー監視の方法として、top/htop による CPU とプロセスの確認、free によるメモリ確認、iostat・iotop によるディスク I/O 調査、iftop・nload・vnstat による帯域使用量の確認、ss による接続元の特定、そして cron スクリプトによる簡易アラートを紹介します。Debian/Ubuntu と Rocky Linux/AlmaLinux の VPS・専用サーバーに対応しています。

ステップ1:監視ツールをインストール

top・free・ss は標準で入っていますが、それ以外はインストールが必要です。Rocky/AlmaLinux では先に EPEL を有効にします。以降の例ではインターフェース名を eth0 としているので、ip -br addr で実際の名前を確認してください。

# Debian / Ubuntu
apt install -y htop sysstat iotop iftop nload vnstat nethogs
# Rocky Linux / AlmaLinux (most tools are in EPEL)
dnf install -y epel-release
dnf install -y htop sysstat iotop iftop nload vnstat nethogs

ip -br addr          # find your network interface name (eth0, ens3, ...)

ステップ2:CPU 使用率と負荷を確認(top・htop)

load average の 3 つの数値は 1・5・15 分平均の負荷で、CPU コア数を継続的に超えていれば処理が追いついていません。top では次の 3 項目に注目します。us が高いとアプリ自体が CPU を消費、wa が高いとディスク待ちなので I/O を調べます。VPS で st(steal)が継続して高い場合はホスト側の競合が考えられるため、チケットでサポートにご相談ください。

nproc                # number of CPU cores
uptime               # load average for 1, 5 and 15 minutes
top                  # 1 = per-core view, P = sort by CPU, M = sort by memory, q = quit
htop                 # F6 to choose the sort column, F9 to send a signal
ps aux --sort=-%cpu | head -n 10

ステップ3:メモリ使用量と OOM を確認

メモリの逼迫は free -h の free 列ではなく available 列で判断します。Linux は空きメモリをキャッシュに使うため、free が少ないのは正常です。vmstat の si/so が 0 以外で続く場合はスワップが多発しています。プロセスが突然消えたときは dmesg で OOM Killer の記録を確認しましょう。不足している場合はスワップを追加(「Swap」の記事を参照)するかプランを見直します。

free -h
vmstat 1 5                                   # si/so > 0 continuously = swapping
ps aux --sort=-%mem | head -n 10
dmesg -T | grep -iE "out of memory|killed process"
journalctl -k --since "1 day ago" | grep -i oom

ステップ4:ディスク I/O と容量の問題を調べる

iostat で %util が 100% 近く、await が大きく上昇していればディスクが飽和しています。続いて iotop で読み書きの多いプロセスを特定します。データベース、ログ書き込み、バックアップ処理がよくある原因です。sysstat を有効にすると 10 分ごとに記録され、sar で過去の状況も確認できます。容量不足は「ディスク容量不足」の記事を参照してください。

iostat -xz 1 5        # watch %util, r_await / w_await, rkB/s and wkB/s
iotop -oPa            # only processes doing I/O, accumulated totals
df -h                 # space usage
df -i                 # inode usage

# Keep history with sysstat, then read it with sar
systemctl enable --now sysstat
sar -u                # CPU today
sar -d -p             # disks today

ステップ5:リアルタイム帯域と通信量の集計

nload はインターフェースの送受信速度をリアルタイムで表示し、iftop は接続先 IP ごとの通信量を一覧表示するので、誰が大量にダウンロードしているかすぐにわかります。nethogs はプロセス単位で表示します。vnstat はバックグラウンドで日別・月別の通信量を記録し、帯域や転送量の確認に便利です。心当たりのない送信トラフィックが多い場合は、侵害されて外部へ攻撃している可能性があります。

ip -s link show eth0          # total RX/TX bytes since boot
nload eth0                    # live in/out graph
iftop -i eth0 -nNP            # live traffic per remote host and port
nethogs eth0                  # live traffic per process

systemctl enable --now vnstat
vnstat -i eth0 -l             # live rate
vnstat -d                     # daily totals
vnstat -m                     # monthly totals

ステップ6:ss で接続と帯域の発生源を特定

ss は netstat の高速な後継です。以下のコマンドで接続元 IP ごとの確立済み接続数を集計すると、過剰なクローラーや HTTP フラッドの発信元がすぐに見つかり、ファイアウォールや Fail2ban で遮断できます。

ss -s                                              # connection summary
ss -tunp | head -n 30                              # connections with process names
ss -lntup                                          # listening ports

# Top 10 remote IPs by number of established TCP connections
ss -Htn state established | awk '{sub(/:[0-9]+$/,"",$4); print $4}' \
  | sort | uniq -c | sort -rn | head -n 10

# Connections to your web server only
ss -Htn state established '( sport = :443 )' | wc -l

ステップ7:cron スクリプトで簡易アラート

Zabbix や Prometheus を導入していない場合でも、小さなスクリプトで 5 分ごとに負荷・利用可能メモリ・ディスク使用率をチェックし、しきい値を超えたらログに記録して Webhook(Telegram ボット、Slack、Discord など。JSON 形式は各サービスに合わせて調整)へ通知できます。

cat > /usr/local/bin/check-health.sh <<'EOF'
#!/bin/bash
LOAD_MAX=$(nproc)          # alert when 1-min load > number of cores
MEM_MIN_MB=200             # alert when available memory < 200 MB
DISK_MAX=90                # alert when a filesystem is >= 90 % full
WEBHOOK="https://hooks.example.com/your-webhook"
HOST=$(hostname)
MSG=""

LOAD=$(cut -d' ' -f1 /proc/loadavg)
if awk -v l="$LOAD" -v m="$LOAD_MAX" 'BEGIN{exit !(l>m)}'; then
  MSG+="load $LOAD > $LOAD_MAX; "
fi

AVAIL=$(free -m | awk '/^Mem:/{print $7}')
if [ "$AVAIL" -lt "$MEM_MIN_MB" ]; then MSG+="available memory ${AVAIL}MB; "; fi

while read -r USE MNT; do
  if [ "${USE%\%}" -ge "$DISK_MAX" ]; then MSG+="disk $MNT at $USE; "; fi
done < <(df -P -x tmpfs -x devtmpfs | awk 'NR>1{print $5, $6}')

if [ -n "$MSG" ]; then
  echo "$(date '+%F %T') $HOST $MSG" >> /var/log/health-alert.log
  curl -s -m 10 -H 'Content-Type: application/json' \
    -d "{\"text\":\"[$HOST] $MSG\"}" "$WEBHOOK" > /dev/null
fi
EOF
chmod +x /usr/local/bin/check-health.sh
/usr/local/bin/check-health.sh; tail /var/log/health-alert.log

# Run every 5 minutes: crontab -e
*/5 * * * * /usr/local/bin/check-health.sh
スクリプトはあくまで最低限の備えです。重要なサーバーには Netdata、Zabbix、Prometheus と Grafana などを導入し、別サーバーからの外形監視も組み合わせると、サーバー全体が停止したときにも通知を受け取れます。

よくある質問

top の CPU 使用率は低いのに負荷が高い

負荷にはディスク I/O 待ち(D 状態)のプロセスも含まれます。wa の値と iostat を確認してください。多くはディスクの混雑やネットワークストレージの遅延が原因です。

vnstat に「no data available」と表示される

インストール直後はまだデータがありません。サービスを起動したまま数分待ってください。vnstat --iflist に対象のインターフェースが表示されることも確認します。

帯域を最も使っているプロセスを知るには?

nethogs eth0 でプロセスごとのリアルタイム通信量を確認し、ss -tunp でそのプロセスの接続先を調べれば、正常な通信かどうか判断できます。

上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。サーバー IP、OS バージョン、実行したコマンド、エラー全文を添えていただくと、より迅速に調査できます。

この回答はお役に立ちましたか?

関連チュートリアル