En esta pregunta, me gustaría encontrar la mejor configuración / hardware posible para entregar 40 Gbps desde un único servidor.
Situación
Tenemos un servidor proxy de video compartido que descarga picos de servidores de almacenamiento lento detrás de él. Todo el tráfico es solo HTTP. El servidor actúa como un proxy inverso (archivos que no están en caché en el servidor) y un servidor web (archivos que se almacenan en unidades locales).
Actualmente hay algo así como 100 TB de archivos y creciendo en los servidores de almacenamiento de fondo.
El mecanismo de almacenamiento en caché se implementa de forma independiente y esta pregunta no trata sobre el almacenamiento en caché en sí mismo, ya que funciona muy bien: actualmente ofrece 14 Gbps, pasa a los servidores de backend solo 2 Gbps. Entonces el uso de caché es bueno.
Objetivo
Logre 40 Gbps o incluso más rendimiento de una sola máquina.
Hardware 1
HW: Supermicro SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), 16GB DDR4 RAM, 2x Supermicro 10G STGN-i1S (LACP L3 + 4)
SSD: 1x 512GB Samsung, 2x 500GB Samsung, 2x480GB Intel 535, 1x 240GB Intel S3500
Sistema:
- irqbalancer se detuvo
- set_irq_affinity para cada interfaz (a través de un script en el tarball del controlador ixgbe)
- ixgbe-4.3.15
- Fecha límite de planificador de E / S
- iptables empty (módulos descargados)
- Sistema de archivos: XFS
Nginx:
- enviar archivo
- hilos aio
- directio 1M
- tcp_nopush en
- tcp_nodelay on
Como se ve en los gráficos, pudimos impulsar 12.5Gbps. Lamentablemente, el servidor no respondió.
Hay 2 cosas que me llamaron la atención. El primero es una gran cantidad de IRQ. En este caso, desafortunadamente no tengo gráficos de / proc / interrupts. Lo segundo fue la alta carga del sistema, que creo que fue causada por que kswapd0 tuvo problemas para trabajar solo con 16G de RAM.
Hardware 2
HW: Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), 128GB DDR4 RAM, 2x Supermicro 10G STGN-i1S
SSD, la configuración del sistema es la misma que la del hardware 1. Nginx tiene sendfile activado (aio / sendfile en comparación adicional).
Esto parece mejor, así que ahora que tenemos un servidor, que funciona en picos, podemos probar algunas optimizaciones.
Sendfile vs hilos aio
Traté de desactivar sendfile y usar hilos aio en su lugar.
- enviar archivo
- hilos aio
- directio 1M (que coincide con todos los archivos que tenemos)
vs
- enviar en
Luego, a las 15:00, volví a enviar archivos y volví a cargar nginx (por lo que me tomó un tiempo terminar las conexiones existentes). Es bueno que la utilización de la unidad (medida por iostat) haya disminuido. Nada ha cambiado en el tráfico (desafortunadamente zabbix decidió no recopilar los datos de bond0).
sendfile activado / desactivado
Solo intenté activar / desactivar el envío. Nada ha cambiado excepto reprogramar interrupciones.
irqbalancer como servidor / cron / deshabilitado
Como @lsd mencionó, intenté configurar irqbalancer para que se ejecute a través de cron:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
Lamentablemente no ayudó en mi caso. Una de las tarjetas de red comenzó a comportarse de manera extraña:
No pude encontrar lo que estaba mal en los gráficos y, como sucedió al día siguiente nuevamente, inicié sesión en el servidor y vi que un núcleo estaba al 100% (uso del sistema).
Traté de iniciar irqbalance como un servicio, el resultado seguía siendo el mismo.
Luego decidí usar el script set_irq_affinity y solucionó el problema de inmediato y el servidor presionó 17Gbps nuevamente.
Hardware 3
Actualizamos al nuevo hardware: 2U 24 (+2) unidades de chasis (6xSFF), 2x Xeon E5-2620v4, 64GB DDR4 RAM (módulos de 4x16GB), 13x SSD, 2x tarjetas de red Supermicro (con chip Intel). Las nuevas CPU mejoraron mucho el rendimiento.
La configuración actual permanece: sendfile, etc. La única diferencia es que solo dejamos que una sola CPU maneje ambas tarjetas de red (a través del script set_irq_affinity).
Se ha alcanzado el límite de 20 Gbps.
¿Próximo objetivo? 30 Gbps.
Siéntase libre de enviarme ideas sobre cómo mejorar el rendimiento. Estaré encantado de probarlo en vivo y compartir algunos gráficos pesados aquí.
¿Alguna idea de cómo lidiar con una gran cantidad de SoftIRQ en la CPU?
Esta no es una pregunta sobre la planificación de la capacidad: ya tengo el hardware y el tráfico. Siempre puedo dividir el tráfico en varios servidores (lo que tendré que hacer en el futuro de todos modos) y solucionar el problema con dinero. Sin embargo, esta es una pregunta sobre la optimización del sistema y el ajuste del rendimiento en un escenario real en vivo.