unicornさん、スワップ領域拡張後に、またもや稼働中にメモリ不足で止まりました。

ERROR -- : Cannot allocate memory - fork(2) (Errno::ENOMEM)

サービス自体は、3つのEC2インスタンスを稼働させているため問題はありませんが、早いところ復帰させたい&何度も止まらないようにしたいところです。

ターミナル(ssh接続)

# メモリ使用量を確認
$ 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メモリのキャッシュやスワップをクリア・解放する方法

スワップのキャッシュをクリアしてみます

ターミナル(ssh接続)

$ sudo swapoff -a && swapon -a
swapoff: /swap/Swapfile: swapoff が失敗しました: Cannot allocate memory

失敗しました。
続いて、メモリが足りないとのことなので、スワップ領域ではないですが、メモリのキャッシュクリアをしてみます。

ターミナル(ssh接続)

# ページキャッシュのみクリア
$ 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

ターミナル(ssh接続)

# 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

ターミナル(ssh接続)

# ページキャッシュと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

続いて、スワップキャッシュを再度クリアしてみます

ターミナル(ssh接続)

$ sudo swapoff -a && swapon -a
swapoff: /swap/Swapfile: swapoff が失敗しました: Cannot allocate memory

失敗しました。。
参考にしたサイト

ということで、スワップをさらに拡張します。

ターミナル(ssh接続)

#すでに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

これでスワップを拡張することができました。

改めて、スワップキャッシュをクリアしてみます。

ターミナル(ssh接続)

$ sudo swapoff -a && swapon -a
swapoff: /swap/Swapfile: swapoff が失敗しました: Cannot allocate memory

だめでした。。


うーん、、と悩んだ後、EC2を再起動することにしました。

ターミナル(ssh接続)

# 再起動
$ 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まで増加したため、メモリ不足であれば、再起動したほうがすぐに解決できそうです。
追加で拡張したスワップファイルについては、下記にて削除し、前回作成したスワップファイルを有効化しました。

ターミナル(ssh接続)

# 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

そして、システム起動時に自動でスワップ領域が有効になるように設定します。

ターミナル(ssh接続)

# /etc/fstabファイルを編集
$ vi /etc/fstab
#下記を追記して保存
/swap/Swapfile swap swap defaults 0 0

再起動後、スワップ領域が有効になっていることを確認できました。

次回は、メモリキャッシュ解放の自動化を行なってみたいと思います。