Bir yukarı akış unix soketine proxy işlevi yapan bir nginx sunucusu çalıştırıyorum, şunun gibi:
upstream app_server {
server unix:/tmp/app.sock fail_timeout=0;
}
server {
listen ###.###.###.###;
server_name whatever.server;
root /web/root;
try_files $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
Bazı uygulama sunucusu işlemleri, sırayla, /tmp/app.sock
kullanılabilir olduklarında istekleri geri çeker . Burada kullanılan belirli uygulama sunucusu Unicorn'dur, ancak bunun bu soru ile alakalı olduğunu sanmıyorum.
Mesele şu ki, belli bir yük geçmişinde, nginx soketten yeterince hızlı bir şekilde istek alamıyor gibi görünüyor. Kaç tane uygulama sunucusu işlemi kurduğumun önemi yok.
Nginx hata günlüğünde şu mesajlardan bir sel alıyorum:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Birçok istek, 502 durum koduyla sonuçlanır ve bu işlemlerin tamamlanması uzun sürmez. Nginx yazma kuyruğu statüsü 1000 civarında.
Her neyse, burada bariz bir şeyi kaçırdığımı hissediyorum, çünkü nginx ve uygulama sunucusunun bu özel yapılandırması, özellikle Unicorn'da oldukça yaygındır (aslında önerilen yöntemdir). Ayarlanması gereken herhangi bir linux çekirdek seçeneği veya nginx'te bir şey var mı? Giriş soketindeki verimi artırma konusunda bir fikriniz var mı? Açıkça yanlış yaptığım bir şey mi?
Çevre hakkında ek bilgi:
$ uname -a
Linux servername 2.6.35-32-server #67-Ubuntu SMP Mon Mar 5 21:13:25 UTC 2012 x86_64 GNU/Linux
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
$ unicorn -v
unicorn v4.3.1
$ nginx -V
nginx version: nginx/1.2.1
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
TLS SNI support enabled
Güncel çekirdek tweaks:
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 16777216 16777216 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.route.flush = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.somaxconn = 8192
net.netfilter.nf_conntrack_max = 524288
Nginx kullanıcısı için Ulimit ayarları:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit -n
diyor 65535
.
ulimit
Özellikle açık dosyaların sayısını kontrol ettiniz mi?