ローカルに構築しているDBコンテナ(MySQL)が重いクエリを投げると、落ちてしまうので原因を調査しました。
似た事象で困っている方の助けになれば嬉しいです。
事象
約160万件ほどのレコードが入ったテーブルで、PRIMARY KEYを変えたり、パーティション切ろうとすると、途中で失敗してしまう。
エラーは下記。
Communications link failure
ちなみに、wait_timeoutの設定は28800とかで、そんな時間はかかっていません。
原因
メモリ不足でコンテナが落ちたため。
コンテナが落ちたので、MySQLに接続できず、コネクションエラーが起きたという感じです。
解決策
DockerDesktopForMacを使っていたので、管理画面でメモリの割り当て量を2GB→4GBにして解決しました。
調査
docker logs -f {コンテナ名}
DBコンテナのMySQLのログを見ると、特に何も書いておらず、最初はコンテナが落ちたのかすらわからなかったです。
ただ、コンテナに入った状態で、上のエラーが起こると、追い出されていたので、コンテナ側で異常が起きたことはわかっていました。
異常があるとすればリソース周りかなと思い、
docker stats {コンテナ名}
でコンテナのCPU使用率やメモリ使用量を確認したところ、クエリを実行すると、メモリ使用量が上がり、限界値まではいかないものの、6、7割のところで、コンテナが落ちることがわかりました。
最初この6、7割の数値に騙されて、メモリ不足でもないかと思っていましたが、
これは実は他のコンテナも動いているため、実質1コンテナが使えるメモリが限界値の数値でないだけです。
(この仕様、前も似たような事象が起きて知っていたのですが、ド忘れしてました。)
メモリ不足だと気づき、Dockerのメモリの限界値を上げるため、
docker-composeのresourcesオプションの設定しました。
が、なぜか反映されない。
ここで、MacでDocker使っていることに気づき、DockerDesktopForMacの管理画面で、メモリ割り当て量の設定値があり、そちらを変えたら、反映されました。
なお、
docker stats -a
とすると全コンテナのリソースが確認ができるので、リソース系はこっちで見た方がよさそうです。