ねむいです。
ねむるまえの開発をしていたら、なぜか Cloud Run で次のようなエラーが無限に出るようになってしまいました。
ずっと複数のコンテナが起動と終了を繰り返しているので、そのまま寝てしまうとなんか課金額がヤバいことになりそうなので、ひとまずトラシューしていきます。
(弱小個人開発Webアプリで数千円が一晩で消えるのは痛いよ。)
以下、エラー内容です。
Memory limit of 512 MiB exceeded with 519 MiB used. Consider increasing the memory limit, see https://cloud.google.com/run/docs/configuring/memory-limits
この記事では最終的な解決策は見つかっていません。
もし同じ問題で困って、この記事にたどり着いて、その後、原因や解決策がわかったら、教えていただける聖人様がいてくださることを願うばかりです。
追記: Dockerfile を改善して本番環境にデプロイされる node_modules
のサイズを削減したところ、コンテナのメモリサイズが 512 MiB でも動くようになりました。
おそらく、アプリ立ち上げ時に node_modules
(の全体もしくは一部)をメモリにロードすることから、立ち上げ時に一時的にメモリ使用量が増えていたことが原因の一つかと思います。
やったこと その1: メモリ増量
とりあえずねむいので、課金についてはいったん忘れて、エラーにあるとおり、メモリを 512 MiB から 1 GiB にあげてみます。
それでもエラーは消えません。
やったこと その2:エラー文でしらべる。
超絶要約すると、 「Google Cloud の Console のバグだぜ。」ってことらしい。(ホンマか?)
じゃあどうやってこのエラー止めんの?
やったこと その3:放置
放置というよりも、この記事を書いていたらエラーが止まっていました。
何が起きたのか簡単に見てみます。
まず、最後のエラーは 23:07:02 。
メモリおよびCPU使用率は、上記の最終エラー直後の 23:08~23:09 から下降しています。
また、最後にコンテナへ届いたリクエストは 22:59:00 のようです。
時系列で整理してみると、以下のようになります。
- 22:59:00: 最終リクエスト
- 23:07:02: 最終エラー
- 23:08:00: CPU使用率降下
- 23:09:00: メモリ使用率降下
このあっっっさいログ分析から導き出せる仮説としては、「リクエストが落ち着いてから再起動されると、表題のエラーが収まる」ということになるかと思います。
その他の情報: Cloud Run ではコンテナ上で出力されたファイルがインメモリに保存される
今回の、 Memory limit exceeded エラーが頻発する問題とは少し違う気がしましたが、最近行った変更でファイル出力をしているようなものがないか見てみたいと思います。
まとめ
結論は、仮説としての「放置すれば治る。」ということになってしまいました。
原因追及までいたらず、気持ち悪さが残りますが、いったんねむれるので良しとします。
今後も同じような問題が起こるようであれば、もう一度時間をかけて見てみて、追加情報をこちらに追記したいと思います。