unicornさん、スワップ領域拡張後に、またもや稼働中にメモリ不足で止まりました。
ERROR -- : Cannot allocate memory - fork(2) (Errno::ENOMEM)
サービス自体は、3つのEC2インスタンスを稼働させているため問題はありませんが、早いところ復帰させたい&何度も止まらないようにしたいところです。
# メモリ使用量を確認
$ free -t
total used free shared buff/cache available
Mem: 980012 775616 74328 996 130068 67984
Swap: 2097148 2097092 56
Total: 3077160 2872708 74384
freeで利用できるトータルが少ない、かつ、スワップ領域が残り僅かです。
スワップ領域のリセットを試みます。
下記サイトを参考に対処してみます。
LinuxでRAMメモリのキャッシュやスワップをクリア・解放する方法
スワップのキャッシュをクリアしてみます
$ sudo swapoff -a && swapon -a
swapoff: /swap/Swapfile: swapoff が失敗しました: Cannot allocate memory
失敗しました。
続いて、メモリが足りないとのことなので、スワップ領域ではないですが、メモリのキャッシュクリアをしてみます。
# ページキャッシュのみクリア
$ sudo sync; echo 1 > /proc/sys/vm/drop_caches
total used free shared buff/cache available
Mem: 980012 778808 113592 996 87612 86040
Swap: 2097148 2097088 60
Total: 3077160 2875896 113652
# dentryとinodesのクリア
$ sudo sync; echo 2 > /proc/sys/vm/drop_caches
total used free shared buff/cache available
Mem: 980012 771848 120680 996 87484 93116
Swap: 2097148 2097088 60
Total: 3077160 2868936 120740
# ページキャッシュとdentry、inodesのクリア
$ sudo sync; echo 3 > /proc/sys/vm/drop_caches
total used free shared buff/cache available
Mem: 980012 771624 123044 996 85344 94400
Swap: 2097148 2097088 60
Total: 3077160 2868712 123104
すごい、ページキャッシュとdentry、inodesクリアすることでメモリを開放できました。
74,328 => 123,044
続いて、スワップキャッシュを再度クリアしてみます
$ sudo swapoff -a && swapon -a
swapoff: /swap/Swapfile: swapoff が失敗しました: Cannot allocate memory
失敗しました。。
参考にしたサイト
ということで、スワップをさらに拡張します。
#すでに2GiB作成済みのため、今回は1GiB追加します。
$ sudo dd if=/dev/zero of=/Swapfile2 bs=1M count=1024
=> 1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 7.09356 秒、 151 MB/秒
#swapディレクトリへ移動
$ sudo mv Swapfile2 swap
#swapディレクトリへ移動
$ cd swap
#権限変更
$ sudo chmod 600 Swapfile2
#スワップファイル用としてフォーマット
$ sudo mkswap Swapfile2
=> スワップ空間バージョン 1 を設定します。サイズ = 1024 MiB (1073737728 バイト)
ラベルはありません, UUID=97acab24-115b-4715-9cb8-629f44d1b34f
# スワップファイルを有効化
$ sudo swapon Swapfile2
$ free -t
total used free shared buff/cache available
Mem: 980012 817188 70040 1092 92784 45032
Swap: 3145720 2097148 1048572
Total: 4125732 2914336 1118612
これでスワップを拡張することができました。
改めて、スワップキャッシュをクリアしてみます。
$ sudo swapoff -a && swapon -a
swapoff: /swap/Swapfile: swapoff が失敗しました: Cannot allocate memory
だめでした。。
うーん、、と悩んだ後、EC2を再起動することにしました。
# 再起動
$ sudo reboot
#sshで再接続後
$ free -t
total used free shared buff/cache available
Mem: 980008 133268 486164 388 360576 708756
Swap: 0 0 0
Total: 980008 133268 486164
なるほど、再起動することでスワップがリセットされました。
freeの物理メモリについても再起動前123,044 => 486,164まで増加したため、メモリ不足であれば、再起動したほうがすぐに解決できそうです。
追加で拡張したスワップファイルについては、下記にて削除し、前回作成したスワップファイルを有効化しました。
# swapディレクトリへ移動
$ cd /swap
#追加で作成したスワップファイルを削除
$ rm Swapfile2
# スワップファイルを有効化
$sudo swapon Swapfile
$ free -t
total used free shared buff/cache available
Mem: 980008 145468 472984 388 361556 699080
Swap: 2097148 0 2097148
Total: 3077156 145468 2570132
そして、システム起動時に自動でスワップ領域が有効になるように設定します。
# /etc/fstabファイルを編集
$ vi /etc/fstab
#下記を追記して保存
/swap/Swapfile swap swap defaults 0 0
再起動後、スワップ領域が有効になっていることを確認できました。
次回は、メモリキャッシュ解放の自動化を行なってみたいと思います。