LoginSignup
10
8

More than 3 years have passed since last update.

UnicornがResource temporarily unavailableを吐いたらbacklogの値を確認してみる

Posted at

背景

railsアプリケーションをnginx+unicornで稼働させている際、以下のエラーが発生していました。
nginxとunicorn間は、UNIXソケットで通信しています。

nginx.log
connect() to unix:/tmp/unicorn.sock failed (11: Resource temporarily unavailable) while connecting to upstream

この時の事象としては、UNIXソケットへの接続がbacklogの値(接続キューのサイズ)を超えてしまったため発生していました。
AmazonLinuxですと、最大接続数の上限はデフォルトだと128となっていました。

ssコマンドで、各ソケットのbacklogの値を確認できます。

$ ss -ax | grep -e unicorn
u_str  LISTEN     0      128    /tmp/unicorn.sock 38120                 * 0
$ sysctl net.core.somaxconn
net.core.somaxconn = 128

対応内容

OSのbacklogの上限変更を行います。
以下のコマンドで変更可能ですが、再起動で元に戻ってしまいます。

$ sudo sysctl -w net.core.somaxconn=256
net.core.somaxconn = 256

/etc/sysctl.confに追記すると起動の都度反映されるようになります。

/etc/sysctl.conf
net.core.somaxconn = 256

railsアプリケーション上での設定は、listenする際に指定可能です。
config/unicorn.rbに指定した値は、OSでの上限より大きくはなりません。

config/unicorn.rb
listen "/tmp/unicorn.sock", backlog: 256

unicornを再起動すると、以下のようにbacklogの値が変更されていることを確認できます。

$ ss -ax | grep -e unicorn
u_str  LISTEN     0      256    /tmp/unicorn.sock 38120                 * 0
10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8