こんにちは、くまごろーです。
先日SpringBootでWebアプリを作成したんですが、数日に一回くらい、気が付いたらアプリが停止しているんですよね。
アプリの継続起動はLinuxの方で設定しているにもかかわらず・・・🤔
まだ日が浅いのでこれが根本的な解決になってるのかはわかりませんが、今回の問題を解消するためにやったことをまとめます。
1 ログの確認
なにはともあれ、とりあえずログを確認します。
Linuxでは、システム関連のログは/var/log/messagesに出力されます。
こんな一行を発見。
</var/log/messages>
Mar 21 00:32:44 ip SpringBoot.jar: /home/application/SpringBoot.jar: line 278: 9199 Killed
なぜかSpringBootアプリがkillされている・・・
このログを遡ってみていくと、こんな記録がありました。
Mar 21 00:32:44 ip kernel: VM Thread invoked oom-killer: gfp_mask=0x14201ca(GFP_HIGHUSER_MOVABLE|__GFP_COLD), nodemask=(null), order=0, oom_score_adj=0 Mar 21 00:32:44 ip kernel: 160 total pagecache pages Mar 21 00:32:44 ip kernel: 0 pages in swap cache Mar 21 00:32:44 ip kernel: Swap cache stats: add 0, delete 0, find 0/0 Mar 21 00:32:44 ip kernel: Free swap = 0kB //スワップメモリが0? Mar 21 00:32:44 ip kernel: Total swap = 0kB ~ 略 ~ Mar 21 00:32:44 ip-10-0-10-10 kernel: Out of memory: Kill process 9199 (java) score 835 or sacrifice child Mar 21 00:32:44 ip-10-0-10-10 kernel: Killed process 9199 (java) total-vm:3344188kB, anon-rss:865400kB, file-rss:0kB, shmem-rss:0kB Mar 21 00:32:44 ip-10-0-10-10 kernel: oom_reaper: reaped process 9199 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
これは、もしかしてメモリが足りていない?だからJavaのプロセスがkillされてるのか?
ところで、oom-killerとはなんだろう?
OOM Killer(Out of Memory Killer)は,システムが実メモリーと仮想メモリー空間(スワップ領域)を使い切り,必要なメモリー領域を新たに確保できない場合に,プロセスを強制終了させて空きメモリーを確保する,Linuxカーネルの仕組みです。
参照:OOM Killer | 日経クロステック(xTECH)
なるほどー(-"-)
とりあえず、スワップ領域が足りないのが原因でOOM Killerにkillされているらしいことまではわかった。
2 スワップ領域の確認
というわけで、とりあえず現状のスワップ領域がどんな感じになっているのか確認します。
Linuxのメモリ利用状況確認には、以下のコマンドを使用します。
free [オプション]
※ オプションキーについてはこちらに詳しく説明されています。
【 free 】コマンド――メモリの利用状況を表示する:Linux基本コマンドTips(125) - @IT
このコマンドで確認したところ、私のサーバーのスワップ領域はゼロでした・・・
初期設定はゼロなのかな?ここらへんLinuxの理解が浅すぎるのでわからん😭
Linux知識の必要性を痛感しつつ、スワップ領域の割り当て方法を検索する・・・
3 スワップ領域を割り当てる
スワップ領域の割り当てを行うには、スワップファイルというものを作成しなければならないらしい。
(1)中身を0で埋めたスワップファイルを作成する
# dd if=/dev/zero of=/var/swap bs=1M count=1024
※ ddコマンドについてはこちらのページで説明されています
【 dd 】コマンド――ブロック単位でファイルをコピー、変換する:Linux基本コマンドTips(163) - @IT
(2)作成したファイルをスワップファイルに設定する
# mkswap /var/swap
(3)swapon および swapoff コマンドでON/OFFを制御する
#swapon /var/swap
(4)結果
total used free shared buff/cache available Mem: 983M 796M 83M 124K 103M 65M Swap: 1.0G 19M 1.0G Total: 2.0G 815M 1.1G
1.0G分のスワップ領域が割り当てられていることがわかります。
今回はとりあえずこれで様子を見てみることにします。
転職活動が落ち着いたらLinuxのこともちゃんと勉強したいな・・・
4 参考