EC2のout of memoryエラー
Vue.jsとLaravelで作ったプロジェクトをAWSのEC2を使って公開していたのですが、
ある時アクセスしてみると504 Gateway-timeoutエラーで表示できなくなっていました。
AWSにログインしてインスタンスを確認してみると該当のインスタンスは
システム/インスタンス共にチェック失敗となっていました、、
システムログを確認してみます。そこでこんなエラーを見つけました。
Out of memory: Kill process 11606 (sshd) score 3 or sacrifice child
どうやらメモリ不足によりsshdがkillされてしまっているようです。
公式Docを見るとメモリ不足の発生のリスクを軽減する為の方法として下記が記載されていました。
アプリケーションを本番環境に移行する前に、
テストを実行してアプリケーションのメモリ要件を把握します。
アプリケーションは、十分なリソースがあるホストでのみ実行。
この2点について何も考えずに安いからという理由でt2.micro(メモリ1G)を選んだ結果
このようなことが起きてしまいました。反省です。
インスタンスを手動で再起動してSSH接続しfree -hコマンドでメモリを確認します。
free -h total used free shared buff/cache available Mem: 989M 802M 95M 824K 91M 70M
オプションの-hは human の頭文字で、人間が見やすいように、ちょうどよい単位で表示してくれます。
表示結果の見方はこうです。
total→メモリの合計
used→メモリの使用量
free→メモリの空き
shared→共有メモリに割り当てられたメモリ
buff/cache→バッファキャッシュに割り当てられたメモリ
available→スワップせずに使用できる量
空きが95Mとのことなのでなんらかのタイミングでメモリ使用率が100%に達してしまい
メモリ不足のエラーが発生した、ということでしょうか。
このメモリ不足を解決する為の解決策として2点が上げられていました。
+ インスタンスタイプをメモリ容量がもっと高いものにアップグレードする。
- swapファイルを作成する
インスタンスをアップグレードする方法が手っ取り早そうではあるのですがコストが高くなる可能性があるので
今回はswapファイルを作成して様子を見てみることにします。
swapファイルがわからない人の為の説明
スワップファイルとは、メモリの一部に代替されるハードディスク上の記憶領域のこと。
仮想メモリ(仮想記憶)とは、メインメモリが不足した際に、ハードディスクをメモリの一部に代替して利用するOSの機能のことを言う。
ハードディスク上に「スワップファイル」と呼ばれる専用の領域を用意し、メインメモリ容量が不足したら、ハードディスクの一部をメモリに見立てて使用する。
具体的には、メインメモリデータの中から、使われていないメモリ領域のデータを一時的にハードディスクに退避させ、必要が生じた際にメモリに書き戻す。
swapファイルの作成方法についてはこちらの公式Docの手順通りで作成できるのでそちらをご覧ください。
スワップファイルを使用して Amazon EC2 インスタンスのスワップ領域としてメモリを割り当てる
とりあえずはこれで様子を見ていこうと思います。