Saya menjalankan server nginx yang bertindak sebagai proxy ke soket unix hulu, seperti ini:
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;
}
}
Beberapa server aplikasi memproses, pada gilirannya, menarik permintaan /tmp/app.sock
saat tersedia. Server aplikasi tertentu yang digunakan di sini adalah Unicorn, tapi saya pikir itu tidak relevan dengan pertanyaan ini.
Masalahnya adalah, sepertinya melewati jumlah beban tertentu, nginx tidak bisa mendapatkan permintaan melalui soket dengan kecepatan yang cukup cepat. Tidak masalah berapa banyak proses server aplikasi yang saya atur.
Saya menerima banjir pesan ini di log kesalahan nginx:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Banyak permintaan menghasilkan kode status 502, dan permintaan yang tidak butuh waktu lama untuk diselesaikan. Stat antrian nginx write berkisar sekitar 1000.
Bagaimanapun, saya merasa seperti kehilangan sesuatu yang jelas di sini, karena konfigurasi khusus ini dari nginx dan server aplikasi cukup umum, terutama dengan Unicorn (sebenarnya metode yang disarankan). Apakah ada opsi kernel linux yang perlu diatur, atau sesuatu di nginx? Adakah ide tentang cara meningkatkan throughput ke hulu soket? Sesuatu yang saya jelas salah lakukan?
Informasi tambahan tentang lingkungan:
$ 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
Tweak kernel saat ini:
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
Pengaturan Ulimit untuk pengguna nginx:
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
kata 65535
.
ulimit
, khususnya jumlah file yang terbuka?