あくまで暫定的な対策ですのでご注意を。
先日、AWSの無料枠RHELを使ってwebアプリを検証してたところ、いつの間にかwebアプリのプロセスが停止していることに気がつきました。
システムログを確認するとOom killerでプロセスが停止されている事が判明。
May 29 01:47:04 ip-10-0-0-123 kernel: Timer-1 invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
:
(中略)
:
May 29 01:47:04 ip-10-0-0-123 kernel: Out of memory: Killed process 1392 (java) total-vm:2982040kB, anon-rss:519536kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:1320kB oom_score_adj:0
とりあえず動いてもらえればいい環境でしたが、さすがに停止しては困るので対応することに。。
結論から言うと、スワップ設定をして回避しました。
Oom killerが発生する理由は単純で、単なるメモリ不足。
メモリが不足しているので、システム停止になる前に、必須以外のプロセスを停止することでシステム全体を保護します。
AWSの無料インスタンスはメモリが潤沢ではありません。また、AWSでは基本SWAP設定されていないため、Oom killerに餌食になるようです。
とりあえず、スワップを作ります。
# swapフォルダを作成します。
sudo mkdir /swap
# swap用のファイルを作成します。(2G=1M * 2048)
sudo dd if=/dev/zero of=/swap/swap01_2G bs=1M count=2048
# root以外に変更できないように設定。
sudo chmod 600 /swap/swap01_2G
# swapファイルの作成
sudo mkswap /swap/swap01_2G
(実行結果)
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=994d7ad9-d216-4d44-974b-d693ac7f2df4
# swapの割り当て
sudo swapon /swap/swap01_2G
# swapが見えることを確認
swapon -s
(実行結果)
Filename Type Size Used Priority
/swap/swap01_2G file 2097148 0 -2
# swapが見えることを確認(freeコマンドでも確認)
free
total used free shared buff/cache available
Mem: 825592 105156 53588 12260 666848 589616
Swap: 2097148 0 2097148
# 再起動後も有効にできるよう、/etc/fstabに下記行を追記
/swap/swap01_2G swap swap defaults 0 0
経緯
Oom killer の対処方法でプロセスの優先度を変更するやり方があります。
やり方は簡単で該当プロセスIDを調べて、procフォルダ配下のファイルにechoすればいいのですが、ただ自分の環境だと権限が足らずに、実行できませんでした。
※ec2-userから、Sudo実行したのだがダメでした。。
該当のプロセスがJavaだったので、JVM起動動時のメモリ制限をかけてみたものの、oom killerは元気に動いてしまいました。。
根本対策とはならないものの、苦肉の策で、swap設定をやってみたところ、停止しなくなった。と言う感じでした。
AWSでケチケチインスタンスを利用するときにはスワップ設定でOom Killerを防ぐのが良いと思われます。
今回恥ずかしながら初めてOmm Killer の存在に気がつく事が出来ました。意外とswapって大事かもしれませんね。