Tengo una pequeña configuración de VPS con nginx. Quiero exprimir el máximo rendimiento posible, así que he estado experimentando con la optimización y las pruebas de carga.
Estoy usando Blitz.io para hacer pruebas de carga al OBTENER un pequeño archivo de texto estático, y me encuentro con un problema extraño en el que el servidor parece estar enviando restablecimientos de TCP una vez que el número de conexiones simultáneas alcanza aproximadamente 2000. Sé que esto es muy gran cantidad, pero al usar htop, el servidor todavía tiene mucho de sobra en tiempo de CPU y memoria, por lo que me gustaría averiguar la fuente de este problema para ver si puedo impulsarlo aún más.
Estoy ejecutando Ubuntu 14.04 LTS (64 bits) en un VPS Linode de 2GB.
No tengo suficiente reputación para publicar este gráfico directamente, así que aquí hay un enlace al gráfico Blitz.io:
Aquí hay cosas que he hecho para tratar de descubrir la fuente del problema:
- El valor de configuración de nginx
worker_rlimit_nofile
se establece en 8192 - se ha
nofile
establecido en 64000 para los límites de hardware y software pararoot
y para elwww-data
usuario (como se ejecuta nginx) en/etc/security/limits.conf
no hay indicios de que algo vaya mal
/var/log/nginx.d/error.log
(por lo general, si se encuentra con límites de descriptor de archivo, nginx imprimirá mensajes de error que lo indiquen )Tengo ufw setup, pero no hay reglas de limitación de velocidad. El registro de ufw indica que no se está bloqueando nada y he intentado deshabilitar ufw con el mismo resultado.
- No hay errores indicativos en
/var/log/kern.log
- No hay errores indicativos en
/var/log/syslog
He agregado los siguientes valores
/etc/sysctl.conf
y los he cargadosysctl -p
sin ningún efecto:net.ipv4.tcp_max_syn_backlog = 1024 net.core.somaxconn = 1024 net.core.netdev_max_backlog = 2000
¿Algunas ideas?
EDITAR: Hice una nueva prueba, aumentando a 3000 conexiones en un archivo muy pequeño (solo 3 bytes). Aquí está el gráfico Blitz.io:
De nuevo, según Blitz, todos estos errores son errores de "restablecimiento de la conexión TCP".
Aquí está el gráfico de ancho de banda de Linode. Tenga en cuenta que este es un promedio de 5 minutos, por lo que es un filtro de paso bajo (el ancho de banda instantáneo es probablemente mucho más alto), pero aún así, esto no es nada:
UPC:
E / S:
Aquí está htop
cerca del final de la prueba:
También capturé parte del tráfico usando tcpdump en una prueba diferente (pero de aspecto similar), comenzando la captura cuando comenzaron a aparecer los errores:
sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80
Aquí está el archivo si alguien quiere echarle un vistazo (~ 20MB): https://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=sharing
Aquí hay un gráfico de ancho de banda de Wireshark:
(La línea es todos los paquetes, las barras azules son errores de TCP)
Según mi interpretación de la captura (y no soy un experto), parece que los indicadores TCP RST provienen de la fuente de prueba de carga, no del servidor. Entonces, suponiendo que algo no está mal del lado del servicio de prueba de carga, ¿es seguro asumir que esto es el resultado de algún tipo de gestión de red o mitigación de DDOS entre el servicio de prueba de carga y mi servidor?
¡Gracias!
net.core.netdev_max_backlog
hasta 2000? Varios ejemplos que he visto tienen un orden de magnitud mayor para conexiones gigabit (y 10Gig).