Estoy ejecutando un servidor nginx que actúa como un proxy para un socket ascendente de Unix, como este:
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;
}
}
Algunos procesos del servidor de aplicaciones, a su vez, retiran las solicitudes a /tmp/app.sock
medida que están disponibles. El servidor de aplicaciones particular en uso aquí es Unicorn, pero no creo que sea relevante para esta pregunta.
El problema es que parece que después de una cierta cantidad de carga, nginx no puede recibir solicitudes a través del socket a una velocidad lo suficientemente rápida. No importa cuántos procesos del servidor de aplicaciones configure.
Recibo una avalancha de estos mensajes en el registro de errores de nginx:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Muchas solicitudes dan como resultado el código de estado 502, y las que no tardan mucho en completarse. La estadística de cola de escritura nginx ronda los 1000.
De todos modos, siento que me falta algo obvio aquí, porque esta configuración particular de nginx y el servidor de aplicaciones es bastante común, especialmente con Unicorn (de hecho, es el método recomendado). ¿Hay alguna opción de kernel de Linux que deba configurarse o algo en nginx? ¿Alguna idea sobre cómo aumentar el rendimiento al socket ascendente? ¿Algo que claramente estoy haciendo mal?
Información adicional sobre el medio ambiente:
$ 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
Ajustes actuales del kernel:
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
Configuración ilimitada para el usuario 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
dice 65535
.
ulimit
, específicamente el número de archivos abiertos?