ConoHaのVPSを利用してPythonアプリを複数動かしていたらメモリ不足で他のサービスが落ちた。
元々メモリ1GBプランのConoHa VPSを契約しており、スケールアップでメモリ2GBプランに変更してテスト運用していたのだが、たまにPythonアプリと連携しているMariaDBが落ちるという現象に遭遇。
原因を調べていたらメモリ不足だった。
早速調査して対策します。
※動作確認環境
CentOS Linux 7.9
調査
まず、現在のメモリの状況を調べます。
■freeコマンドで確認
1 2 3 4 |
# free -m total used free shared buff/cache available Mem: 1837 1564 84 22 188 111 Swap: 2047 2047 0 |
実メモリ(物理メモリ)も残りが少なく、スワップは残り0MBです。
■swaponコマンドで確認
1 2 3 |
# swapon -s Filename Type Size Used Priority /var/spool/swap/swapfile file 2097148 2097116 -2 |
■/proc/swapsを確認
1 2 3 |
# cat /proc/swaps Filename Type Size Used Priority /var/spool/swap/swapfile file 2097148 2097116 -2 |
調査の結果は以下の通りです。
- 現在のスワップ領域(スワップファイル)は2GBに設定されている。
- 複数のアプリが同時に起動された際に実メモリが不足してスワップ領域を利用しようとするのだが、2GBのスワップ領域も枯渇してしまいサービスが落ちるという現象が発生。
推奨されるスワップ領域としては今のサイズ(2GB)でも問題ありませんが、近いうちにメモリ4Gプランに更にスケールアップする予定なのでスワップ領域を追加します。
【※参考】システムの推奨 swap 領域
システム内の RAM の容量 推奨されるスワップ領域 ハイバネートを許可する場合に推奨されるスワップ領域 ⩽ 2 GB RAM 容量の 2 倍 RAM 容量の 3 倍 > 2 GB ~ 8 GB RAM 容量と同じ RAM 容量の 2 倍 > 8 GB ~ 64 G 最低 4GB RAM 容量の 1.5 倍 > 64 GB 最低 4GB 最低 4GB ハイバネートは推奨されない
対策(スワップ領域を拡張)
スワップ領域を現状の2GBに2GBを追加して合計4GBにします。拡張する方法は、サーバを止めずにスワップファイルの追加という形で行います。
スワップファイル作成
ddコマンドで2GBのスワップファイルを新規作成します。
※ファイルシステムが「xfs」でも「ext4」でもスワップファイル作成はddコマンドでOKです。
※作成するスワップファイル名はなんでも良いのですが、今回は「swapfile2」とします。
1 2 3 4 |
# dd if=/dev/zero of=/swapfile2 bs=1M count=2048 2048+0 レコード入力 2048+0 レコード出力 2147483648 バイト (2.1 GB) コピーされました、 3.36991 秒、 637 MB/秒 |
スワップファイルのセットアップ
mkswapコマンドで先ほど作成したスワップファイルのセットアップを行います。
1 2 3 |
# mkswap /swapfile2 スワップ空間バージョン1を設定します、サイズ = 2097148 KiB ラベルはありません, UUID=90603f52-6b25-44f7-b87f-7ef22276b01f |
パーミッション変更
セキュリティのためにスワップファイルのパーミッションを600に変更します。
1 |
# chmod 600 /swapfile2 |
パーミッションの確認
lsコマンドでパーミッションを確認します。
1 2 |
# ls -lh /swapfile2 -rw------- 1 root root 2.0G 7月 23 23:09 /swap_add1 |
スワップファイルを有効化してスワップ領域を追加
swaponコマンドでスワップファイルを有効化してスワップ領域を拡張します。
1 |
# swapon /swapfile2 |
スワップ領域の確認
■freeコマンド
1 2 3 4 |
# free -m total used free shared buff/cache available Mem: 1837 1562 103 22 171 111 Swap: 4095 2047 2048 |
■swaponコマンド
1 2 3 4 |
# swapon -s Filename Type Size Used Priority /var/spool/swap/swapfile file 2097148 2097080 -2 /swapfile2 file 2097148 0 -3 |
■cat /proc/swaps
1 2 3 4 |
# cat /proc/swaps Filename Type Size Used Priority /var/spool/swap/swapfile file 2097148 2097080 -2 /swapfile2 file 2097148 0 -3 |
サーバを再起動してもシステムの起動時にスワップファイルを有効化する設定
このままだと、サーバを再起動した際に新規作成したスワップ領域が適用されないので、/etc/fstabをvi等で編集して起動時に有効化する設定を追加します。
まずvi等で/etc/fstabを開きます。
1 |
# vi /etc/fstab |
下記の1行を末尾に追加して/etc/fstabを上書き保存します。
1 |
/swapfile2 swap swap defaults 0 0 |
これでスワップ領域の追加作業は完了です。
スワップファイルを削除して元に戻したい場合
※スワップ拡張の際に作成したスワップファイルは「/swapfile2」だったとして解説します。
スワップファイルの無効化
swapoffコマンドでスワップファイルを無効化します。
1 |
# swapoff -v /swapfile2 |
システムの起動時の設定を削除
スワップ領域拡張時に追加した行を削除します。
vi等で/etc/fstabを開きます。
1 |
# vi /etc/fstab |
スワップ拡張時に追加した下記の1行を削除して/etc/fstabを上書き保存します。
1 |
/swapfile2 swap swap defaults 0 0 |
systemctlコマンドを実行してマウントユニットを再生成します。
1 |
# systemctl daemon-reload |
スワップファイルの削除
rmコマンドでスワップファイルを削除します。
1 |
# rm /swapfile2 |
確認
下記のコマンドにて正常にスワップ領域が削除されたか確認しましょう。
free -m
swapon -s
cat /proc/swaps
以上で拡張したスワップ領域の削除が完了です。
まとめ
- 実メモリが足りなくなるとスワップ領域が利用される
- スワップ領域も足りなくなるとサービスが落ちることもある
- スワップ領域が足りない場合はサーバを止めなくてもスワップファイルを新規作成してスワップ領域を拡張することが可能
- スワップ領域には推奨サイズがある
- 今後も慢性的に実メモリが足りなくなることが予想される場合は、スケールアップなどにより実メモリの増加を検討すべき
今回はスワップファイル作成&スワップ領域拡張作業により、枯渇していてゼロだった残りのスワップ領域に余裕ができました。これでしばらく安心です。
■作業前のtopコマンド
■作業後のtopコマンド
以上で解決です。