Prefacio
He estado ajustando HAProxy por un tiempo y he realizado muchas pruebas de rendimiento. Desde 100 solicitudes HTTP / s hasta 50 000 solicitudes HTTP / s.
El primer consejo es habilitar la página de estadísticas en HAProxy . NECESITA monitoreo, sin excepción. También necesitará un ajuste fino si tiene la intención de superar las 10,000 solicitudes / s.
Los tiempos de espera son una bestia confusa porque tienen una gran variedad de valores posibles, la mayoría de ellos sin diferencias observables. Todavía tengo que ver que algo falle debido a un número 5% menor o 5% mayor. 10000 vs 11000 milisegundos, ¿a quién le importa? Probablemente no sea tu sistema.
Configuración
En buena conciencia, no puedo dar un par de números como "los mejores tiempos de espera para todos".
Lo que sí puedo decir son los tiempos de espera MÁS agresivos que siempre son aceptables para el equilibrio de carga HTTP (S). Si encuentra más bajo que estos, es hora de reconfigurar su equilibrador de carga.
timeout connect 5000
timeout check 5000
timeout client 30000
timeout server 30000
cliente de tiempo de espera:
El tiempo de inactividad se aplica cuando se espera que el cliente reconozca o envíe datos. En el modo HTTP, este tiempo de espera es particularmente importante a considerar durante la primera fase, cuando el cliente envía la solicitud y durante la respuesta mientras lee los datos enviados por el servidor.
Leer : este es el tiempo máximo para recibir encabezados de solicitud HTTP del cliente.
3G / 4G / 56k / satélite puede ser lento a veces. Aún así, deberían poder enviar encabezados HTTP en unos segundos, NO 30.
Si alguien tiene una conexión tan mala que necesita más de 30 segundos para solicitar una página (luego más de 10 * 30 segundos para solicitar las 10 imágenes incrustadas / CSS / JS), creo que es aceptable rechazarlo.
servidor de tiempo de espera:
El tiempo de inactividad se aplica cuando se espera que el servidor reconozca o envíe datos. En el modo HTTP, este tiempo de espera es particularmente importante a considerar durante la primera fase de la respuesta del servidor, cuando tiene que enviar los encabezados, ya que representa directamente el tiempo de procesamiento del servidor para la solicitud. Para averiguar qué valor poner allí, a menudo es bueno comenzar con lo que se considerarían tiempos de respuesta inaceptables, luego verifique los registros para observar la distribución del tiempo de respuesta y ajuste el valor en consecuencia.
Leer : este es el tiempo máximo para recibir encabezados de respuesta HTTP del servidor (después de que recibió la solicitud completa del cliente). Básicamente, este es el tiempo de procesamiento de sus servidores, antes de que comience a enviar la respuesta.
Si su servidor es tan lento que requiere más de 30 segundos para comenzar a dar una respuesta, entonces creo que es aceptable considerarlo muerto.
Caso especial : algunos servicios RAROS que realizan un procesamiento muy pesado pueden tardar un minuto o más en responder. Es posible que sea necesario aumentar mucho este tiempo de espera para este uso específico. (Nota: es probable que este sea un caso de mal diseño, use una comunicación de estilo asíncrono o no use HTTP en absoluto).
tiempo de espera de conexión:
Establezca el tiempo máximo de espera para que un intento de conexión a un servidor tenga éxito.
Leer : el tiempo máximo que un servidor tiene para aceptar una conexión TCP.
Los servidores están en la misma LAN que HAProxy, por lo que debería ser rápido. Déle al menos 5 segundos porque ese es el tiempo que puede tomar cuando ocurre algo inesperado (un paquete TCP perdido para retransmitir, un servidor que bifurca un nuevo proceso para tomar las nuevas solicitudes, un aumento en el tráfico).
Caso especial : cuando los servidores están en una LAN diferente o sobre un enlace poco confiable. Es posible que sea necesario aumentar mucho este tiempo de espera. (Nota: es probable que esto sea un caso de mala arquitectura).
verificación de tiempo de espera:
Establezca un tiempo de espera de verificación adicional, pero solo después de que se haya establecido una conexión.
Establezca un tiempo de espera de verificación adicional, pero solo después de que ya se haya establecido una conexión Si ha establecido, haproxy usa min ("timeout connect", "inter") como tiempo de espera de conexión para la verificación y "timeout check" como tiempo de espera de lectura adicional. El "min" se utiliza para que las personas que se ejecutan con un "tiempo de espera excedido" muy largo (por ejemplo, aquellos que lo necesitaban debido a la cola o al tarpit) no reduzcan la velocidad de sus controles. (Tenga en cuenta también que no hay una razón válida para tener tiempos de espera de conexión tan largos, porque "cola de tiempo de espera" y "tarpit de tiempo de espera" siempre se pueden usar para evitar eso).
Leer : Al realizar una comprobación de estado, el servidor timeout connect
debe aceptar la conexión y luego timeout check
dar la respuesta.
Todos los servidores DEBEN tener una comprobación de estado HTTP (S) configurada. Esa es la única forma para que el equilibrador de carga sepa si hay un servidor disponible. El chequeo de salud es una /isalive
página simple que siempre responde OK
.
Dé a este tiempo de espera al menos 5 segundos porque es el tiempo que puede tomar cuando sucede algo inesperado (un paquete TCP perdido para retransmitir, un servidor que bifurca un nuevo proceso para tomar las nuevas solicitudes, un pico en el tráfico).
Historia de guerra : Mucha gente cree erróneamente que el servidor siempre puede responder a esta página simple en 3 ms. Establecieron un tiempo de espera agresivo (<2000 ms) con conmutación por error agresiva (2 comprobaciones fallidas = servidor muerto). He visto sitios web enteros cayendo debido a eso. Por lo general, hay un ligero aumento en el tráfico, los servidores de fondo se vuelven más lentos, los controles de salud se retrasan ... hasta que de repente se agotan todos juntos, HAProxy cree que TODOS los servidores murieron de inmediato y todo el sitio se cae.