Hoy tuvimos un pequeño problema de conmutación por error con una de nuestras máquinas virtuales HAProxy. Cuando lo investigamos, encontramos esto:
26 de enero 07:41:45 kernel haproxy2: [226818.070059] __ratelimit: 10 devoluciones de llamada suprimidas 26 de enero 07:41:45 kernel haproxy2: [226818.070064] Memoria fuera de socket 26 de enero 07:41:47 kernel haproxy2: [226819.560048] Memoria fuera de socket 26 de enero 07:41:49 kernel haproxy2: [226822.030044] Memoria fuera de socket
Lo cual, según este enlace , aparentemente tiene que ver con una configuración predeterminada baja para net.ipv4.tcp_mem
. Así que los aumentamos 4 veces de sus valores predeterminados (este es Ubuntu Server, no estoy seguro de si el sabor de Linux importa):
los valores actuales son: 45984 61312 91968 los nuevos valores son: 183936 245248 367872
Después de eso, comenzamos a ver un extraño mensaje de error:
26 de enero 08:18:49 kernel haproxy1: [2291.579726] ¡Ruta de hash chain demasiado larga! 26 de enero 08:18:49 kernel haproxy1: [2291.579732] ¡Ajuste su secret_interval!
Shh .. es un secreto!
Aparentemente, esto tiene que ver con /proc/sys/net/ipv4/route/secret_interval
el valor predeterminado de 600 y controla el vaciado periódico de la caché de ruta
Le
secret_interval
indica al kernel con qué frecuencia debe eliminar TODAS las entradas de hash de ruta, independientemente de cuán nuevas / antiguas sean. En nuestro entorno, esto es generalmente malo. La CPU estará ocupada reconstruyendo miles de entradas por segundo cada vez que se borre el caché. Sin embargo, configuramos esto para que se ejecute una vez al día para mantener a raya las pérdidas de memoria (aunque nunca hemos tenido una).
Si bien nos complace reducir esto, parece extraño recomendar que se elimine toda la caché de la ruta a intervalos regulares , en lugar de simplemente eliminar los valores antiguos de la caché de la ruta más rápido.
Después de investigar un poco, encontramos /proc/sys/net/ipv4/route/gc_elasticity
cuál parece ser una mejor opción para mantener el tamaño de la tabla de ruta bajo control:
gc_elasticity
se puede describir mejor como la profundidad promedio del depósito que el núcleo aceptará antes de que comience a expirar las entradas de hash de ruta. Esto ayudará a mantener el límite superior de las rutas activas.
Ajustamos la elasticidad de 8 a 4, con la esperanza de que la caché de ruta se podara más agresivamente. El secret_interval
no se siente correcto para nosotros. Pero hay un montón de configuraciones y no está claro cuáles son realmente la forma correcta de llegar aquí.
- / proc / sys / net / ipv4 / route / gc_elasticity (8)
- / proc / sys / net / ipv4 / route / gc_interval (60)
- / proc / sys / net / ipv4 / route / gc_min_interval (0)
- / proc / sys / net / ipv4 / route / gc_timeout (300)
- / proc / sys / net / ipv4 / route / secret_interval (600)
- / proc / sys / net / ipv4 / route / gc_thresh (?)
- rhash_entries (parámetro del kernel, ¿valor predeterminado desconocido?)
No queremos hacer el enrutamiento de Linux peor , así que estamos un poco de miedo a meterse con algunos de estos ajustes.
¿Alguien puede aconsejar qué parámetros de enrutamiento son mejores para ajustar, para una instancia de HAProxy de alto tráfico?
/proc/sys/net/ipv4/tcp_max_orphans
usted experimentará un error diferente. La pila completa de Stack Exchange, por ejemplo, tiene/proc/sys/net/ipv4/tcp_max_orphans
65536 y/proc/net/sockstat
da como resultado TCP: inuse 2996 huérfano 171 tw 15972 alloc 2998 mem 1621, una diferencia que no se puede ignorar.Ajustamos algunos de estos parámetros regularmente. Nuestro estándar para plataformas comerciales de alto rendimiento y baja latencia es:
fuente