※本ページには広告(アフィリエイトプログラム等)が含まれます。
メモリ1〜2GBの小さいVPSでよくあるのが、アプリのビルドやバックアップ処理の最中に突然プロセスが落ちる現象だ。dmesgを確認するとOut of memory: Killed processのログが残っていて、いわゆるOOM Killerの仕業だとわかる。契約時にスワップ無しで初期構築されているさくらのVPSでは特に起きやすい。この記事では後からスワップ領域を追加・調整する手順をまとめる。
現状を確認する
まずメモリとスワップの現状を見る。
free -h
swapon --show
free -hのSwap行が全部0なら、そのVPSにはスワップが存在しない状態。swapon --showで何も出力されなければ同じ意味だ。まっさらな状態から作業を始める。
スワップファイルを作成する
パーティションを切り直すのは面倒なので、通常はファイルベースのスワップで十分。まず容量を確保する。
fallocate -l 2G /swapfile
ファイルシステムによってはfallocateが使えない(fallocate failed: Operation not supportedのようなエラーが出る)ことがある。その場合はddで代替する。時間はかかるが確実。
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
次にパーミッションを絞ってからスワップ用にフォーマットし、有効化する。
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
chmod 600をmkswapより前にやるのがポイント。世界読み取り可能なスワップファイルはローカルの他ユーザーから中身を読まれるリスクがあるので、権限は先に絞っておく。
ここでfree -hを再度叩けばSwap行に容量が反映されているはずだ。
再起動後も有効にする(永続化)
ここまでの手順は再起動すると消える。/etc/fstabに1行追記して永続化する。
echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab
編集前にcp /etc/fstab /etc/fstab.bakでバックアップを取っておくと事故った時に安心。fstabを壊すと最悪起動シーケンスで止まるので、慎重に扱うファイルだ。
swappinessを調整する
デフォルトのvm.swappinessは60前後で、これは「わりと積極的にスワップを使う」設定になっている。さくらのVPSはディスクがSSDなので、スワップへの書き込み自体は昔のHDD環境ほど致命的ではないが、それでもRAMよりは圧倒的に遅い。メモリに余裕があるうちからスワップに逃がされるとレイテンシが悪化するので、値を下げておくのが定石だ。
sysctl vm.swappiness=10
これは即時反映だが再起動で元に戻る。恒久化するには/etc/sysctl.d/配下に設定ファイルを置く。
# /etc/sysctl.d/99-swappiness.conf
vm.swappiness=10
/etc/sysctl.confに直接追記する運用でも動くが、パッケージ管理下のファイルを直編集するより/etc/sysctl.d/に自分用の設定ファイルを1本足すほうが管理しやすい。反映確認は次のコマンドで。
sysctl --system
sysctl vm.swappiness
ついでにvm.vfs_cache_pressureにも軽く触れておく。こちらはinode/dentryキャッシュを回収する積極度を決める値で、デフォルトの100から下げる(50前後)とディスクキャッシュを長めに保持できる。ただしメモリが少ないVPSでは下げすぎるとキャッシュがメモリを圧迫する方向に働くので、swappinessほど気軽にいじる項目ではない。効果を見ながら調整する程度で十分だ。
スワップを削除する手順
プランを上げてメモリに余裕ができた、あるいは設定を作り直したい場合の削除手順も書いておく。
swapoff /swapfile
次に/etc/fstabから先ほど追記した行を削除する。vi /etc/fstabやsed -i '/swapfile/d' /etc/fstabなどで該当行を消す。最後にファイル本体を削除する。
rm /swapfile
swapoffを忘れてrmだけ先にやると、カーネルが使用中のスワップ領域を掴んだままファイルだけ消える中途半端な状態になりうるので、必ずswapoff→fstab編集→rmの順で進める。
まとめ
スワップはメモリ不足によるOOM Killerを防ぐための保険であって、常用の作業領域ではない。恒常的にスワップが埋まっているようならそれはメモリ不足のサインなので、スワップを増やすより先にプランのアップグレードやアプリ側のメモリ使用量見直しを検討したほうが筋がいい。とはいえ、突発的なピーク負荷を吸収する安全弁としてはfallocateで2GBほど切っておくだけで十分に効果がある。設定はどれも数分で終わるので、小さいVPSを借りたら初期構築の一環としてやっておいて損はない。
