🔖
EC2のメモリ空き容量が減る場合の対処法
困っている事
- 本番に公開しているAWSが、3日おきぐらいに再起動する
- なぜ本番が3日おきに再起動するのか分からない
環境
- auto scaling使用
- ロードバランサ使用
- rails(6.1)
- 起動はpuma
- EC2プラン: t2.micro
前提情報
- ログに、
OOMキラー
が作動したという記述あり。その後EC2インスタンスが落ちている -
/etc/sysctl.conf
で、OOMキラーが作動した時に、EC2インスタンスが再起動するように設定している - EC2インスタンスが再起動したタイミングでnginxとpumaが起動するcrontabを設定している
- EC2インスタンスは再起動するとメモリがリセットされる
- 約3日後にOOMキラーが作動する、の繰り返し
- サイトは1日に5000人ほどのuserが登録するというアプリ
予想
- メモリリーク
- メモリブロート(メモリ断片化)
- のどちらかではないか
検証
-
メモリリークの特徴: メモリ消費量が徐々に線形に増加
-
メモリ断片化の特徴: メモリ消費量が一定まで増加すると横ばいになっていく
-
まずメモリの消費量推移を監視する必要あり
-
cloud watchでメモリ消費量を監視する設定を行う
gem
- puma worker killerというgemが有名だが
- READMEを読む限り使わない方がいいように見えるので使わない
対策
- 検証の結果、リークか断片化かはっきりとは分からなかった(微妙なグラフ)
- プランが
t2.micro
なのでメモリが少なすぎるのでは -
t3.small
にした所、それ以後は一度も再起動しなくなったので、断片化が原因だったのではないか
その他
- よく使ったコマンド
$ free -m
(メモリ使用量が分かる)
Discussion