【Linux】メモリ不足で落とさない!Swapファイル最適化と自動化シェルスクリプト入門


Linuxサーバーで様々なアプリケーションやコンテナを動かしているとき、突然プロセスが強制終了してしまった経験はありませんか?

その原因の多くは「メモリ不足」にあります。Linuxには、物理メモリ(RAM)が限界に達した際、システムを維持するためにプロセスを強制停止する「OOM Killer(Out of Memory Killer)」という仕組みが備わっているためです。

予算をかけてサーバーの物理メモリを増設できれば一番ですが、個人開発の環境やVPS、検証用のライトな環境では、コストを抑えてなんとかやりくりしたいケースも多いはずです。

そこで今回は、低コストでサーバーの安定性を劇的に向上させる「Swap(スワップ)ファイルの最適化」の手順と、メモリ残量を定期的に監視して自動で通知・ログ記録を行う「実践的な自動化シェルスクリプト」の作り方を詳しく解説します。

1. そもそも「Swap(スワップ)」とは何か?

Swap(スワップ)とは、物理メモリ(RAM)が足りなくなった際、ストレージ(SSDやHDD)の一部を一時的にメモリの代わりとして利用する仕組みのことです。

メモリという「机の上」が書類でいっぱいになってしまったとき、一時的に使わない書類を「引き出し(ストレージ)」に退避させて、机の上のスペースを空けるイメージです。

Swapのメリットと注意点

  • メリット: メモリ不足による突然のシステムダウンや、プロセスの強制終了(OOM Killer)を未然に防ぐことができる。
  • 注意点: ストレージの読み書き速度は物理メモリよりも大幅に遅いため、Swapが頻発するとサーバー全体の処理速度が低下(スラッシング現象)します。あくまで「サーバーを落とさないための安全弁(保険)」として運用するのが基本です。

2. 実践!Swapファイルの作成と最適化手順

Linux(Debian/Ubuntu環境などを想定)で、新しく「2GB」のSwapファイルを作成し、システムに認識させる具体的な手順を解説します。すべての作業はroot権限(またはsudo)で行います。

ステップ①:現在のSwap状況を確認する

まずは、すでにSwapが設定されているか確認します。

sudo swapon –show

何も表示されなければ、現在Swapは設定されていません。また、free -m コマンドでもメモリとSwapの利用状況をメガバイト単位で確認できます。

ステップ②:Swapファイル用の領域を確保する

今回は2GB(2048MB)のファイルを作成します。高速かつ安全に領域を確保するため、dd コマンドを使用します。

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

ステップ③:ファイルの権限(パーミッション)を変更する

安全性の観点から、Swapファイルはrootユーザー以外が読み書きできないように制限する必要があります。ここを怠るとセキュリティリスクになるため、必ず実行してください。

sudo chmod 600 /swapfile

ステップ④:ファイルをSwap領域として初期化する

確保したファイルをLinuxシステムがSwapとして使えるようにフォーマットします。

sudo mkswap /swapfile

ステップ⑤:Swapを有効化する

システムにSwapファイルを認識させ、有効化します。

sudo swapon /swapfile

もう一度 free -m を実行し、「Swap:」の項目に2048MB(約2GB)が追加されていれば成功です!

ステップ⑥:サーバー再起動後も自動で有効化する(永続化)

このままだとサーバーを再起動したときに設定が消えてしまうため、設定ファイル(/etc/fstab)に追記します。

設定ファイルの末尾に、以下の1行を追加してください。

/swapfile none swap sw 0 0

3. さらに安心!メモリ残量を監視する「自動化シェルスクリプト」

Swapを設定して「保険」をかけたら、次は「今、どれくらいメモリが逼迫しているか」を自動で監視できるようにしましょう。

以下は、メモリの空き容量が指定した割合(例:20%以下)になった際、ログファイルに警告を自動記録するシンプルなシェルスクリプトです。cron(定期実行ジョブ)に登録することで、24時間自動監視が可能になります。

メモリ監視スクリプト(check_memory.sh)

Bash

#!/bin/bash

# 警告を出す空きメモリの閾値(%)
THRESHOLD=20

# ログファイルの出力先
LOG_FILE="/var/log/memory_monitor.log"

# 現在の空きメモリ割合(%)を算出
FREE_MEM=$(free | awk '/^Mem:/ {printf "%.0f", $4/$2 * 100}')

# 閾値を下回った場合に警告をログに記録
if [ "$FREE_MEM" -le "$THRESHOLD" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') [WARNING] 空きメモリが低下しています! 現在の空き容量: ${FREE_MEM}%" >> "$LOG_FILE"
    # ここにDiscordやSlack、LINEへの通知コマンド(curl)を挟むことも可能です
fi

スクリプトの動かし方

  1. 上記のコードを check_memory.sh という名前で保存します。
  2. スクリプトに実行権限を与えます。chmod +x check_memory.sh
  3. sudo crontab -e を開き、以下の行を追記して「10分に1回」自動実行させます。*/10 * * * * /パス/to/check_memory.sh

これで、万が一メモリが危険域に達した際も、ログを確認して「どの時間帯に負荷が上がっているか」を正確に把握できるようになります。

4. まとめ:限られたリソースを賢く使いこなそう

今回はLinuxサーバーにおける「Swapファイルの作成方法」と「メモリ自動監視スクリプト」をご紹介しました。

  • Swapファイルは、メモリ不足による突然のサーバーダウンを防ぐ最高の「保険」
  • シェルスクリプトによる自動監視を組み合わせることで、トラブルの予兆にいち早く気づくことができる

低スペックな環境や検証環境でも、こうした少しの工夫と最適化を施すだけで、サーバーの安定性は劇的に向上します。ぜひご自身の環境でも試してみてください!


関連記事

TOP
CONTACT ACCESS LINE CALL