Out of Memory (OOM) という悪夢
よくある光景です。1GB RAMのVPSで3〜4つのDockerコンテナを実行していると、突然システムがフリーズし、ウェブサイトに502エラーが表示され、システムログがMySQLを強制終了(キル)したOOM killerの通知で埋め尽くされる。この状況は、低スペックのサーバーで重いアプリケーションを実行している際に非常によく発生します。
5年間のシステム運用経験の中で、私は新しいサーバーを構築する際、必ず最初にSWAPを設定するようにしています。物理RAM(ストレージの種類によりますが、約10〜100倍遅い)の速度には及びませんが、SWAPは安全なバッファとして機能します。トラフィックの急増によるメモリ消費やメモリリークが発生した際、システムが突然クラッシュするのを防いでくれます。
Swapパーティションか、Swapファイルか?
コマンドを打つ前に、現在のインフラに適した実装方法を決定する必要があります。
1. Swapパーティション(専用パーティション)
これは、ハードディスクの一部を仮想メモリ専用のパーティションとして分割する方法です。
- メリット: 物理ディスクブロックに連続してデータが書き込まれるため、パフォーマンスが最も最適化されます。
- デメリット: 柔軟性に欠けます。SWAP容量を拡張するにはパーティションテーブルの操作が必要になり、稼働中のサーバーでは非常にリスクが高い作業となります。
2. Swapファイル(SWAPファイル)
現在のパーティション内に、仮想メモリとして機能する大きなファイルを作成する方法です。
- メリット: 圧倒的な柔軟性。サーバーを再起動することなく、わずか30秒でSWAPを2GBから4GBに増やすことができます。
- デメリット: ファイルシステムのオーバーヘッドにより、パフォーマンスがわずかに低下します。しかし、SSDやNVMeの時代において、この差はほとんど無視できるレベルです。
アドバイス: Vultr、DigitalOcean、AWSなどのクラウドVPSを使用している場合は、管理の手間を省くためにSwapファイルを選択することをお勧めします。
Swapファイルの正しい構築手順
以下の手順は、Ubuntu 20.04/22.04、Debian、およびRHEL系(CentOS、AlmaLinux)で共通して利用できます。
ステップ1:リソースの確認
まず、以下のコマンドでサーバーに既に仮想メモリが設定されているか確認します。
sudo swapon --show
結果が空の場合、サーバーは物理RAMのみで動作しています。free -hコマンドを使用して、空き容量の合計も確認しておきましょう。
ステップ2:容量ファイルの作成
2GBのSWAPを作成する場合、ディスク空間を即座に割り当てることができるfallocateコマンドが最速の選択肢です。
sudo fallocate -l 2G /swapfile
システムがこのコマンドをサポートしていないというエラーが出た場合は、伝統的なddコマンドを使用してください。
sudo dd if=/dev/zero of=/swapfile bs=1024 count=2097152
ステップ3:SWAPファイルのセキュリティ設定
SWAPファイルにはRAMからの一時的なデータが含まれており、機密情報が含まれる可能性があります。アクセス権限をrootユーザーのみに制限する必要があります。
sudo chmod 600 /swapfile
この手順をスキップすると、サーバーにアクセスできるユーザーであれば誰でも仮想メモリ内のデータを覗き見ることができてしまいます。
ステップ4:システムの有効化
ファイルをフォーマットし、使用可能な状態にします。
sudo mkswap /swapfile
sudo swapon /swapfile
再度free -hを入力すると、Swapの行に「2.0Gi」という数値が表示されているはずです。
ステップ5:永続化の設定
デフォルトでは、SWAP設定は再起動後に失われます。起動時にシステムが自動的に認識するように、/etc/fstabに設定を追加します。まず、念のためバックアップを作成しましょう。
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Swappinessパラメータの最適化
RAMがまだ残っているのに、なぜLinuxがSWAPを使用して動作が遅くなるのか、疑問に思う人が多いでしょう。その主な原因はSwappiness(0〜100の値)という指標にあります。
- デフォルト (60):RAMの空き容量が約40%になった時点で、LinuxはSWAPの使用を開始します。
- 推奨設定 (10-20):RAMが本当に限界に達したとき(残り約10%)にのみSWAPを使用するようにします。
即座に10に設定するには:
sudo sysctl vm.swappiness=10
この設定を保存するには、/etc/sysctl.confファイルの末尾にvm.swappiness=10という行を追加してください。
実戦での経験則
私がまとめた3つの黄金律を紹介します。
- 容量の計算式: RAMが2GB以下の場合は、RAMの2倍(2x)のSWAPを作成します。RAMが4GB以上の場合は、RAMと同容量(1x)のSWAPを作成すれば十分です。
- I/O Waitの警告:
topコマンドで%waの値が頻繁に10%を超える場合、CPUがSWAPのディスク処理を待ちすぎていることを意味します。この場合、仮想メモリで凌ぐのではなく、物理RAMのアップグレードを検討すべき時です。 - SSDの寿命: SWAPがSSDを故障させることを過度に心配する必要はありません。現代のSSDはTBW(Total Bytes Written)が非常に高く、数年間にわたるSWAPの書き込み強度にも十分耐えられます。
SWAP設定は基本的な技術ですが、サーバーの安定性を高めるためには極めて重要です。システムの最適化が成功することを願っています!

