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
, khususnya jumlah file yang terbuka?ulimit -n
kata65535
.Jawaban:
Kedengarannya seperti hambatan adalah aplikasi yang memberi daya pada soket alih-alih Nginx itu sendiri. Kami melihat ini banyak dengan PHP ketika digunakan dengan soket versus koneksi TCP / IP. Dalam kasus kami, kemacetan PHP jauh lebih awal daripada Nginx.
Sudahkah Anda memeriksa batas pelacakan koneksi sysctl.conf, batas simpanan soket
net.core.somaxconn
net.core.netdev_max_backlog
sumber
Anda dapat mencoba melihat
unix_dgram_qlen
, lihat dokumen proc . Meskipun ini dapat menambah masalah dengan menunjuk lebih banyak dalam antrian? Anda harus melihat (netstat -x ...)sumber
Saya dipecahkan dengan menambah jumlah backlog di config / unicorn.rb ... Saya dulu punya backlog 64.
dan saya mendapatkan kesalahan ini:
Sekarang, saya meningkat menjadi 1024 dan saya tidak mendapatkan kesalahan:
sumber
tl; dr
listen("/var/www/unicorn.sock", backlog: 1024)
worker_connections 10000;
Diskusi
Kami memiliki masalah yang sama - aplikasi Rails dilayani oleh Unicorn di belakang proxy terbalik NGINX.
Kami mendapatkan baris seperti ini di log kesalahan Nginx:
Membaca jawaban lain, kami juga menduga bahwa mungkin Unicorn yang harus disalahkan, jadi kami menambah simpanannya, tetapi ini tidak menyelesaikan masalah. Memantau proses server, sudah jelas bahwa Unicorn tidak mendapatkan permintaan untuk bekerja, sehingga NGINX tampaknya menjadi penghambat.
Mencari pengaturan nginx untuk Tweak di
nginx.conf
ini kinerja artikel tala menunjuk keluar beberapa setting yang bisa berdampak berapa banyak parallel permintaan nginx dapat memproses, terutama:sumber
nilai default backlog adalah 1024 dalam konfigurasi unicorn.
http://unicorn.bogomips.org/Unicorn/Configurator.html
1024 klien adalah batas soket domain unix.
sumber