Rails アプリに対して 4 つの Unicorn プロセスを実行すると、使用可能なすべての MySQL 接続が消費され、「接続が多すぎます」というエラーで崩壊します。今日、DB インスタンスを 4 回再起動する必要がありました。=(
プロセス
$ ps 斧 | grep [u]ni 21618 ? Sl 0:15 ユニコーンマスター -D -c /home/deployer/apps/XXX/shared/config/unicorn.rb -E production 21632 ? Sl 0:20 ユニコーン ワーカー[0] -D -c /home/deployer/apps/XXX/shared/config/unicorn.rb -E production 21636 ? Sl 0:14 ユニコーン ワーカー[1] -D -c /home/deployer/apps/XXX/shared/config/unicorn.rb -E production 21640 ? Sl 0:20 ユニコーン ワーカー[2] -D -c /home/deployer/apps/XXX/shared/config/unicorn.rb -E production 21645 ? Sl 0:12 ユニコーン ワーカー[3] -D -c /home/deployer/apps/XXX/shared/config/unicorn.rb -E production
私のdatabase.ymlは、ActiveRecord プール用に 22 の接続を設定しています...
... 製造: アダプター: mysql2 エンコーディング: utf8 データベース: xxx ユーザー名: xxx パスワード: xxx ホスト: xxx ポート: 3306 プール: 22 ...
Unicornの設定ファイルは次のようになります。
working_directory "/home/deployer/apps/XXX/current"
pid "/home/deployer/apps/XXX/shared/pids/unicorn.pid"
stderr_path "/home/deployer/apps/XXX/shared/log/unicorn.log"
stdout_path "/home/deployer/apps/XXX/shared/log/unicorn.log"
「/tmp/unicorn.XXX.sock」を聞く
worker_processes 4
タイムアウト 100
preload_app 真
before_fork do |サーバー、ワーカー|
# データベース接続が引き継がれないので切断
定義されている場合は?ActiveRecord::ベース
ActiveRecord::Base.connection.disconnect!
終わり
# 古いユニコーンのプロセスをやめる
old_pid = "#{server.config[:pid]}.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
始める
Process.kill("QUIT", File.read(old_pid).to_i)
Errno::ENOENT、Errno::ESRCH のレスキュー
# 他の誰かが私たちの仕事をしてくれました
終わり
終わり
終わり
after_fork do |サーバー、ワーカー|
# ワーカーでデータベース接続を再起動します
定義されている場合?(ActiveRecord::Base)
ActiveRecord::Base. Establish_connection
終わり
child_pid = server.config[:pid].sub(".pid", ".#{worker.nr}.pid")
system("echo #{Process.pid} > #{child_pid}")
終わり
DB コンソールを見ると、次のように表示されます。彼らは接続のほとんどを食べました。(今はユニコーンしか動いていませんでした) 私の考えでは、1 つの接続 * 4 つのユニコーン = 4 つの接続があるはずでした。
mysql> 完全なプロセスリストを表示します。 +-----+----------------------+-------------------------------- --------------+----------------------------+------ ---+------+-------+-----------------------+ | | ID | ユーザー | ホスト | ホスト デシベル | コマンド | 時間 | 状態 | 情報 | +-----+----------------------+-------------------------------- --------------+----------------------------+------ ---+------+-------+-----------------------+ | | 2 | rdsadmin | ローカルホスト:31383 | ヌル | 睡眠 | 9 | | | ヌル | | | 52 | レベル | 212.100.140.42:50683 | レベルトラベルプロダクション | クエリ | 0 | ヌル | 完全なプロセスリストを表示 | | | 74 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38197 | レベルトラベルプロダクション | 睡眠 | 5 | | | ヌル | | | 75 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38199 | レベルトラベルプロダクション | 睡眠 | 8 | | | ヌル | | | 76 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38201 | レベルトラベルプロダクション | 睡眠 | 8 | | | ヌル | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ カット ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | 157 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38321 | レベルトラベルプロダクション | 睡眠 | 154 | | | ヌル | | | 158 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38322 | レベルトラベルプロダクション | 睡眠 | 17 | | | ヌル | | | 159 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38325 | レベルトラベルプロダクション | 睡眠 | 54 | | | ヌル | | | 160 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38326 | レベルトラベルプロダクション | 睡眠 | 54 | | | ヌル | | | 161 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38327 | レベルトラベルプロダクション | 睡眠 | 54 | | | ヌル | | | 162 | レベル | ip-10-55-10-151.eu-west-1.compute.internal:38329 | レベルトラベルプロダクション | 睡眠 | 42 | | | ヌル | +-----+----------------------+-------------------------------- --------------+----------------------------+------ ---+------+-------+-----------------------+ セットで 90 行 (0.15 秒)
この問題の背景については、sidekiq リポジトリの Issue #503 も参照してください。 https://github.com/mperham/sidekiq/issues/503