Ruby on Rails 5.2 + Puma 4 で、 logrotate 時に puma を再起動したあとに不要な worker が残り続ける
Ruby on Rails 5.2 + Puma 4 の構成で、 Rails アプリケーションのログを logrotate でローテートをしていて、ローテートされる際に puma を再起動しています。
puma の再起動は pumactl phased-restart
で使って行なっていますが、以前は SIGUSR1 シグナルを送って再起動させていました。
具体的には下記のようなコードです。
test -s $pid && kill -USR1 "$(cat /path/to/app/tmp/pids/puma.pid)"
参考: https://github.com/puma/puma/blob/master/docs/restart.md
しばらくは問題なく再起動されるのですが、何回か目の再起動のタイミングで下記のように不要な worker が残った状態になります。下記では worker 7 が二つある状態になっています。おそらく pid = 15241 の方が不要な worker と思われます。
$ ps aux | grep [p]uma
username 10096 22.8 3.0 3357088 1012940 ? Sl 13:01 1:12 puma: cluster worker 0: 14749 [app]
username 10135 26.6 3.0 3562476 1016716 ? Sl 13:01 1:22 puma: cluster worker 1: 14749 [app]
username 10196 17.9 3.4 3688000 1145328 ? Sl 13:01 0:54 puma: cluster worker 2: 14749 [app]
username 10243 15.6 3.9 3753452 1287424 ? Sl 13:01 0:46 puma: cluster worker 3: 14749 [app]
username 10325 16.8 3.6 3758280 1189004 ? Sl 13:01 0:48 puma: cluster worker 4: 14749 [app]
username 10381 15.9 3.1 3423564 1034904 ? Sl 13:01 0:45 puma: cluster worker 5: 14749 [app]
username 10420 16.6 3.2 3689844 1070112 ? Sl 13:01 0:46 puma: cluster worker 6: 14749 [app]
username 10464 21.9 2.6 3155296 888148 ? Sl 13:01 0:59 puma: cluster worker 7: 14749 [app]
username 14749 0.0 0.0 216884 20340 ? Sl 7月19 0:56 puma 4.0.0 (tcp://0.0.0.0:9292) [app]
username 15241 60.7 9.2 5273704 3049272 ? Sl 11:02 75:20 puma: cluster worker 7: 14749 [app]
質問の内容としましては、このような状態にならずに、不要な worker が残らずに puma が再起動される方法が知りたいです。
もしくは、なぜこのような状態になるかを調査するため、各 worker がどのような状態になっているか、リクエストをさばける状態になっているか、を調べる方法があれば知りたいです。( worker 番号を指定して、もしくはプロセスに対して直接、リクエストを投げることができたりしますか...?)
もしくは、ログなどを仕込んで事後的に状況を確認する方法があればご教示いただきたいです。
前述の通り puma の再起動は pumactl phased-restart
で行なっていますが、 SIGUSR1 シグナルを送る方法でも同様の状況になっていました。(といいますか、 SIGUSR1 シグナルで今回の相談内容のような状況になったので、 pumactl
コマンドで再起動したら改善されないかと思い、 pumactl
の方法に変更をしてみたのですが、特に改善しませんでした。)
主な利用バージョンは下記の通りです。
- Ruby: 2.4.2
- Ruby on Rails: 5.2.2.1
- Puma: 4.0.0