Unicorn のインストール

Unicorn

Install

シラサギのインストールがまだの人は、次の資料を参考にシラサギのインストールを済ませてください。

設定ファイル

$ vi config/unicorn.rb
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2)
listen 3000
timeout 120
preload_app true

root = File.expand_path("../../", __FILE__)
pid "#{root}/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.stderr.log"
stdout_path "#{root}/log/unicorn.stdout.log"

worker_processes

listen

timeout

pid

stderr_path

stdout_path

自動起動設定 (簡易版)

$ crontab -e
@reboot /bin/bash -l -c 'cd /var/www/shirasagi && bundle exec rake unicorn:start'

自動起動設定

# cp /var/www/shirasagi/bin/unicorn-centos7_asdf.service /etc/systemd/system/unicorn.service
# chmod +x /etc/systemd/system/unicorn.service
# systemctl enable unicorn

パフォーマンス調整について

(1) workerプロセス数の調整

動的な画面の表示等で 502(Bad Gateway)エラーや 504(Gateway Timeout)エラーが発生する場合は、原因の一つとしてリクエスト量に対してunicorn workerプロセスの数が足りていないことが考えられます。
その場合、workerプロセス数を増やすことで解消できる場合があります。

workerプロセス数は上記「設定ファイル」項の”worker_processes”値を変更し、nginxを再起動(リロードでも可)する事で対応できます。
(対応後psコマンド等でunicorn workerプロセスの個数を確認ください。)

注意点)

(2) workerの使用メモリ上限値の調整

SHIRASAGIではunicornのメモリ消費対策としてunicorn-worker-killerを利用しています。 unicorn-worker-killerにメモリ利用上限の範囲を設定しておくことでworkerのメモリ利用が設定範囲以上に達すると自動的にworkerを再起動します。 アクセスが多い環境や、扱うデータが多い環境では標準の設定では頻繁に上限を超えてしまい、短時間でworkerの再起動を繰り返す状況となります。 この状態になると再起動のオーバーヘッド負荷等により動的処理に於いて十分なパフォーマンスが得られない状況となります。

再起動頻度の確認は log/unicorn.stderr.log で確認が可能です。 “Unicorn::WorkerKiller send SIGQUIT”で再起動され”worker=0 ready”でworker 0号機の再起動が完了という意味になりますが、同一号機のworkerの再起動が数分に1回発生している状況だと再起動過多と思われます。

その場合上記”send SIGQUIT”の前に設定上限を超えた旨のログが記録されていると思います。 メモリ上限のケースが多くその場合下記のようなログ内容となります。

“worker (pid: xxxx) exceeds memory limit (823857152.0 bytes > 641051371 bytes)”

この例ですと、左辺byte数のメモリ利用があり右辺byteを超えた為再起動した旨になりますので、設定値を左辺byte数以上とすることで再起動を抑えられます。

設定ファイルは shirasagiディレクトリ直下の config.ru ファイルになります。

$ vi config.ru
# Max memory size (RSS) per worker
mem_min = (ENV['UNICORN_KILLER_MEM_MIN'] || 512).to_i
mem_max = (ENV['UNICORN_KILLER_MEM_MAX'] || 576).to_i

上記例では512MB~576MBが設定されており、この上限範囲を調整してunicornを再起動する事で対応できます。

注意点)