結論
Docker Composeをメモリの小さなサーバで動かしていると、メモリをたくさん使うコンテナがExited with code 137で停止してしまう。
今回停止してしまったコンテナはMySQLであり、Performance SchemaをOFFにすることでメモリ使用量を大幅に削減し、今の所正常に動作中(経過観察中)。
経緯
就職活動にてポートフォリオとして制作したWebアプリですが、Docker Composeを使用して開発、そしてVPSで公開する際もDocker Composeを使用して公開しています。
【個人開発】韓国語の文法を復習するアプリ「サクッと作文 韓国語」のデモ版をリリースしました #個人開発 - Qiita
VPS上にてdocker compose up にてコンテナを起動した時には問題は起きず、正常に使えます。しかし、しばらく時間が経つ(数日など)と、いつのまにかエラーが表示され、どうやらデータベースが動いていないと推測できました。
Dockerでエラーの原因を調べる
コンテナの状態を確認する
docker container ls
不具合が起こってから上記のコマンドでコンテナの一覧を表示させたところ、MySQLコンテナが見つかりません。
docker container ls -a
aオプションを追加して停止中のコンテナも表示させたところ、MySQLコンテナが停止してしまっていました。
docker ps -a
更にこちらのコマンドで確認すると、Exited(137)とのこと。こちらのコードを調べてみると、メモリ不足により停止したことがわかりました。
Docker containerが突然止まる問題 | freks blog
コンテナのメモリ使用状況を調べる
docker stats
こちらのコマンドで調べてみると、MySQLコンテナだけで400MiB以上使用されていました。私はさくらのVPSを1Gで使用中ですので、かなりの割合です。これが原因のようです。
確かに、ローカルではコンテナは停止しません。原因を突き止めました。
MySQLのメモリ使用量を大幅に削減する
MySQLコンテナが大量にメモリを使用しているのはわかりましたが、使用量を減らせるのでしょうか。もし減らせないのなら、VPSの契約を1Gから2Gに変更する必要があるかもしれません。今はまだそこまでお金をかけられない。
困っていたところ、いろいろ探した結果「Performance Schema」というものを見つけました。
performance schemaとは
MySQL5.6にてperformance_schemaを停止したところ、メモリの使用量が圧倒的に減少した | 田舎に住みたいエンジニアの日記
このPerformance Schemaというものが非常に重要な機能だとしたら、停止したらよくないのかもしれないので調べてみました。
Performance Schemaの仕組みと活用法の紹介 - freee Developers Hub
第4回 MySQLチューニング(3) パフォーマンススキーマ | gihyo.jp
このあたりを読むと、もともとはデフォルトはOFF、本番環境ではOFFが推奨されていたということから、OFFにしても問題はないと判断しました。将来的にMySQLを高度に使いたい時に使用するかもしれませんが、今の所大丈夫そうです。
Performance Schemaの状態を確認する
MySQL内で以下のコマンドを実行します。
SHOW VARIABLES LIKE 'performance_schema';
こちらでONであることが確認できました。
Performance SchemaをOFFにする
my.cnf(MySQLの設定ファイル)に以下の行を追加するだけです。
[mysqld]
performance_schema=off
Dockerコンテナの場合、my.cnfに上記を追加し、コンテナを再ビルドしたところ、OFFにすることができました。
Performance SchemaをOFFにした結果
docker statsで調べたところ、メモリ使用量は約400MiBから約150MiBまで減りました。
こちらの対処を行なった後、今の所MySQLコンテナは停止していません。今後の経過観察が必要ですが、メモリ不足でコンテナが停止することがあること、Dockerコンテナのメモリ使用量の調べ方、Performance Schemaというものがあることを知り、勉強になりました。