heroku上ではRubyプロセスのメモリ使用率を正確に取得できない
この記事はHeroku Advent Calendar 10日目の記事です。
https://qiita.com/advent-calendar/2018/heroku
Railsアプリを運用しているとプロセスのメモリ使用率が右肩上がりに上昇していくので、しきい値を超えるとプロセスを再起動する、というのはよくある話だと思います。
pumaには https://github.com/schneems/puma_worker_killer というgemがあり、
しきい値を超えると再起動することができます。しかしheroku環境では掲題の通りプロセスのメモリ使用率を正確に取得できないため、メモリを使いまくったプロセスを再起動することができません。
本件は https://github.com/schneems/puma_worker_killer に書いている通り、定期的にプロセスを再起動するとよい、ということが書かれています。
しかしながらプロセスを再起動すると、プロセスが停止して立ち上がるまでの数秒間はリクエストの消化が止まることになるので、リクエストタイムアウトを迎える可能性が高くなると言えます。
この定期再起動ソリューション以外に、ログに出力されるruntime-heroku-metrics
の値を参照して、dynoまるごと再起動する、という方法も存在しています。
dynoを再起動する方法は、prebootが有効になっているならアプリケーションのスループット低下はほぼないはずです。
しかし、アプリケーションの不具合でR14警告が出るくらいのメモリを大量に使う処理が存在していると、
dynoを再起動し続けるので監視をする必要がありそうです。
以上。
-
category:
- rails tags: