Ich verwende einen Nginx-Server, der als Proxy für einen Upstream-Unix-Socket fungiert, wie folgt:
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;
}
}
Einige App Server-Prozesse ziehen Anforderungen ab, sobald /tmp/app.sock
sie verfügbar sind. Der hier verwendete App-Server ist Unicorn, aber ich denke nicht, dass dies für diese Frage relevant ist.
Das Problem ist, es scheint nur, dass Nginx nach einer bestimmten Last keine Anfragen mehr schnell genug über den Socket erhalten kann. Es spielt keine Rolle, wie viele App Server-Prozesse ich eingerichtet habe.
Ich erhalte eine Flut dieser Meldungen im Nginx-Fehlerprotokoll:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Viele Anfragen führen zu Statuscode 502 und solchen, deren Fertigstellung nicht lange dauert. Die Nginx-Schreibwarteschlangen-Statistik liegt bei 1000.
Wie auch immer, ich habe das Gefühl, dass ich hier etwas Offensichtliches vermisse, da diese spezielle Konfiguration von Nginx und App Server ziemlich häufig ist, insbesondere bei Unicorn (es ist die empfohlene Methode). Gibt es irgendwelche Linux-Kernel-Optionen, die gesetzt werden müssen, oder etwas in Nginx? Irgendwelche Ideen, wie der Durchsatz zum Upstream-Socket erhöht werden kann? Etwas, das ich eindeutig falsch mache?
Zusätzliche Informationen zur Umwelt:
$ 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
Aktuelle Kernel-Optimierungen:
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
Ulimit-Einstellungen für den Nginx-Benutzer:
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
, insbesondere die Anzahl der geöffneten Dateien?ulimit -n
sagt65535
.Antworten:
Es hört sich so an, als ob der Engpass die App ist, die den Socket mit Strom versorgt, anstatt Nginx selbst zu sein. Wir sehen dies häufig bei PHP, wenn es mit Sockets im Vergleich zu einer TCP / IP-Verbindung verwendet wird. In unserem Fall sind PHP-Engpässe jedoch viel früher als Nginx.
Haben Sie das sysctl.conf-Limit für die Verbindungsverfolgung und das Socket-Backlog-Limit überprüft?
net.core.somaxconn
net.core.netdev_max_backlog
quelle
Sie könnten versuchen , auf der Suche
unix_dgram_qlen
finden proc docs . Obwohl dies das Problem verschlimmern kann, indem Sie mehr in die Warteschlange zeigen? Du musst schauen (netstat -x ...)quelle
Ich habe das Problem gelöst, indem ich den Rückstand in der Datei config / unicorn.rb erhöht habe. Früher hatte ich einen Rückstand von 64.
und ich bekam diesen Fehler:
Jetzt habe ich auf 1024 erhöht und bekomme den Fehler nicht:
quelle
tl; dr
listen("/var/www/unicorn.sock", backlog: 1024)
worker_connections 10000;
Diskussion
Wir hatten das gleiche Problem - eine Rails-App, die von Unicorn hinter einem NGINX-Reverse-Proxy bereitgestellt wurde.
Im Nginx-Fehlerprotokoll wurden folgende Zeilen angezeigt:
Beim Lesen der anderen Antworten stellten wir auch fest, dass möglicherweise Unicorn die Schuld trägt, und erhöhten daher den Rückstand, was das Problem jedoch nicht löste. Beim Überwachen von Serverprozessen war es offensichtlich, dass Unicorn nicht die Anforderungen zum Arbeiten bekam, sodass NGINX der Engpass zu sein schien.
Bei der Suche nach NGINX-Einstellungen zur Optimierung in
nginx.conf
diesem Artikel zur Leistungsoptimierung wurden verschiedene Einstellungen aufgeführt, die sich auf die Anzahl der parallelen Anforderungen auswirken können, die NGINX verarbeiten kann.quelle
Der Standardwert für das Backlog ist 1024 in der Einhorn-Konfiguration.
http://unicorn.bogomips.org/Unicorn/Configurator.html
1024-Client ist Unix-Domain-Socket-Limit.
quelle