Edited at

sidekiq を安全に止める

More than 1 year has passed since last update.

ワーカーに変更を加えた場合、変更を有効にするためには sidekiq を再起動する必要があります。しかし、sidekiq は一度起動すると働き続けるため、いきなり止めるのは危険です。手順を踏んで再起動しましょう。


1. TSTP で kill

# >= 5.0.0

kill -TSTP [worker_pid]

# < 5.0.0
kill -USR1 [worker_pid]

まず deploy する前に TSTP(v5.0.0 未満は USR1) で kill します。これで sidekiq は新しいプロセスを生成しなくなります。プロセスを見てみると下記のように stopping と書かれ、徐々にスレッド数が減っていくのがわかると思います。0 になると全てのスレッドが処理を完了したことがわかります。

しかし、特に処理の完了は待たずに deploy を開始します。

sidekiq 3.3.1 app_name [9 of 25 busy] stopping


2. TERM で kill

kill -TERM [worker_pid]

USR1 で kill しただけではプロセスが立ち上がらなくなるだけなので、deploy が完了したら sidekiq を停止させます。プロセスを確認すると sidekiq のプロセスがなくなったことがわかります。以上で安全に停止することができます。


sidekiqctl

kill コマンドを使わなくても、ターミナルから sidekiqctl を使って sidekiq を停止することができます。

# start of deploy

# quiet sends USR1
sidekiqctl quiet [pidfile]
# ... deploy happens ...
# stop sends TERM with a hard deadline to kill -9
sidekiqctl stop [pidfile] [deadline_timeout]

USR1 での kill は sidekiqctl quiet [pidfile]、TERM は sidekiqctl stop [pidfile] [deadline_timeout] が対応しています。

deadline_timeout は 60 秒で、60 秒待っても停止しない場合は kill -9 で強制終了します。


Capistrano

Capistrano を使って deploy している人は、capistrano-sidekiq を使うことでこれらの動作を自動化できます。

これで自動に deploy 開始時に TSTP が送られ、完了時に再起動します。


参照