Korzystam z serwera nginx, który działa jako serwer proxy do nadrzędnego gniazda unix, w następujący sposób:
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;
}
}
Niektóre procesy serwera aplikacji z kolei pobierają żądania, /tmp/app.sock
gdy stają się dostępne. Konkretnym serwerem aplikacji, który jest tutaj używany, jest Unicorn, ale nie sądzę, żeby miało to związek z tym pytaniem.
Problem polega na tym, że po prostu wydaje się, że po pewnym obciążeniu nginx nie może odbierać żądań przez gniazdo z wystarczającą szybkością. Nie ma znaczenia, ile procesów serwera aplikacji skonfigurowałem.
Dostaję zalew tych wiadomości w dzienniku błędów nginx:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Wiele żądań powoduje kod stanu 502 i te, których wypełnienie nie zajmuje dużo czasu. Statystyki kolejki zapisu nginx oscylują wokół 1000.
W każdym razie wydaje mi się, że brakuje mi czegoś oczywistego, ponieważ ta szczególna konfiguracja nginx i serwera aplikacji jest dość powszechna, szczególnie w przypadku Unicorn (jest to zalecana metoda). Czy są jakieś opcje jądra Linuksa, które należy ustawić, czy coś w Nginx? Wszelkie pomysły na temat zwiększenia przepustowości do gniazda upstream? Coś, co wyraźnie robię źle?
Dodatkowe informacje o środowisku:
$ 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
Aktualne poprawki jądra:
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
Ustawienia Ulimit dla użytkownika 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
konkretnej liczby otwartych plików?ulimit -n
mówi65535
.Odpowiedzi:
Wygląda na to, że wąskim gardłem jest aplikacja zasilająca gniazdo, a nie sama Nginx. Widzimy to bardzo często w przypadku PHP w połączeniu z gniazdami w porównaniu do połączenia TCP / IP. W naszym przypadku jednak wąskie gardła w PHP znacznie wcześniej niż Nginx.
Czy sprawdziłeś limit śledzenia połączenia sysctl.conf, limit zaległości gniazd
net.core.somaxconn
net.core.netdev_max_backlog
źródło
Można spróbować patrząc
unix_dgram_qlen
, zobacz docs proc . Chociaż może to skomplikować problem, wskazując więcej w kolejce? Musisz spojrzeć (netstat -x ...)źródło
Rozwiązałem problem, zwiększając liczbę zaległości w config / unicorn.rb ... Kiedyś miałem zaległości 64.
i otrzymywałem ten błąd:
Teraz zwiększyłem do 1024 i nie otrzymuję błędu:
źródło
tl; dr
listen("/var/www/unicorn.sock", backlog: 1024)
worker_connections 10000;
Dyskusja
Mieliśmy ten sam problem - aplikację Rails obsługiwaną przez Unicorn za odwrotnym proxy NGINX.
W dzienniku błędów Nginx otrzymywaliśmy takie linie:
Po przeczytaniu innych odpowiedzi doszliśmy do wniosku, że winą może być Jednorożec, więc zwiększyliśmy zaległości, ale to nie rozwiązało problemu. Monitorowanie procesów serwera było oczywiste, że Unicorn nie otrzymywał żądań do pracy, więc NGINX wydawał się być wąskim gardłem.
Szukając ustawień NGINX do ulepszenia w
nginx.conf
tym artykule na temat dostrajania wydajności, wskazałem kilka ustawień, które mogą wpłynąć na liczbę równoległych żądań, które NGINX może przetworzyć, w szczególności:źródło
wartość domyślna zaległości wynosi 1024 w konfiguracji jednorożca.
http://unicorn.bogomips.org/Unicorn/Configurator.html
1024 klient jest limitem gniazda domeny unix.
źródło