Descripción del problema
Es posible que experimente pérdida ocasional de paquetes al conectarse a aplicaciones en una instancia ECS. Una investigación muestra que la red externa de la instancia ECS funciona con normalidad, pero los registros del kernel (dmesg) contienen el mensaje de error kernel: nf_conntrack: table full, dropping packet. Este problema afecta a las instancias ECS con las siguientes características:
Imagen: aliyun-2.1903-x64-20G-alibase-20190327.vhd o posterior
Kernel: kernel-4.19.24-9.al7 o posterior
Causa
nf_conntrack es un módulo del kernel de Linux que rastrea las entradas de conexión para la traducción de direcciones de red (NAT). El módulo nf_conntrack almacena las conexiones establecidas en una tabla hash. Cuando esta tabla hash se llena, las nuevas conexiones desencadenan el error nf_conntrack: table full, dropping packet. Los parámetros clave del módulo nf_conntrack incluyen:
nf_conntrack_buckets: El tamaño de la tabla hash de seguimiento de conexiones. Puede especificar este valor cuando se carga el módulo o modificarlo mediante el comando
sysctl. Para sistemas con 4 GB o más de memoria, el valor predeterminado es 65536.nf_conntrack_max: El número máximo de conexiones que el módulo
nf_conntrackpuede rastrear. Para sistemas con 4 GB o más de memoria, el valor predeterminado es 262144. Este valor predeterminado puede ser insuficiente para servidores que gestionan muchas conexiones.nf_conntrack_tcp_timeout_time_wait: El tiempo durante el cual
nf_conntrackconserva la entrada de seguimiento de una conexión TCP en estadoTIME_WAIT. El valor predeterminado es 120 s.
Soluciones
Elija la solución que mejor se adapte a su caso de uso.
Solución 1: Ajustar los parámetros de nf_conntrack
Determine el número máximo de conexiones que podría requerir su aplicación y, a continuación, ejecute los siguientes comandos para ajustar los parámetros del módulo nf_conntrack.
sysctl -w net.netfilter.nf_conntrack_max=1503232
sysctl -w net.netfilter.nf_conntrack_buckets=375808 # This option cannot be modified during runtime if the kernel version is not 4.19.
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=60
Los valores de los parámetros en estos comandos son ejemplos. Ajústelos según su carga de trabajo real y sus requisitos empresariales. Antes de realizar cambios, cree una instantánea o haga una copia de seguridad de los archivos importantes.
Revise las siguientes recomendaciones para la configuración de parámetros:
Si su carga de trabajo implica un alto número de conexiones simultáneas y de corta duración, aumente los valores de
nf_conntrack_maxynf_conntrack_buckets. Esto evita que la tabla hash denf_conntrackse llene. Se recomienda establecer el valor denf_conntrack_maxen cuatro veces el valor denf_conntrack_buckets.Ajuste los parámetros
nf_conntrack_bucketsynf_conntrack_maxde forma conjunta. Si solo aumentanf_conntrack_max, las listas vinculadas en la tabla hash pueden volverse demasiado largas, lo que reduce la eficiencia de búsqueda. Cambiar únicamentenf_conntrack_bucketsno resolverá el problema.-
Antes de ajustar el parámetro
nf_conntrack_tcp_timeout_time_wait, asegúrese de comprender su propósito y sus posibles efectos. Ajuste este parámetro con precaución según el caso de uso de su aplicación y los resultados del monitoreo de rendimiento. Los siguientes ejemplos sirven como referencia para distintos escenarios:Para servicios de alta concurrencia que gestionan muchas conexiones de corta duración, como un servidor web, considere establecer
nf_conntrack_tcp_timeout_time_waiten una duración más breve, como 30 o 60 segundos. Esto libera las entradas de seguimiento de conexiones más rápido y deja capacidad available para nuevas conexiones. No obstante, debe asegurarse de que su aplicación pueda tolerar una pequeña cantidad de retransmisión de datos o latencia potencial.Si su aplicación requiere una integridad de datos extremadamente alta, como un sistema de operaciones financieras, es más seguro mantener el valor predeterminado de
nf_conntrack_tcp_timeout_time_wait. Esto ayuda a garantizar que todos los paquetes de datos se entreguen correctamente.En entornos con latencia de red alta o inestable, un valor más bajo de
nf_conntrack_tcp_timeout_time_waitpuede aumentar el riesgo de pérdida de datos. Se recomienda una configuración más conservadora.
Solución 2: Filtrar conexiones sin seguimiento con reglas de iptables
Agregue reglas de iptables con el destino -j NOTRACK para evitar que se rastreen conexiones específicas. Las conexiones que coinciden con estas reglas no se agregan a la tabla de seguimiento, lo que evita que se llene.
sudo iptables -t raw -A PREROUTING -p udp -j NOTRACK
sudo iptables -t raw -A PREROUTING -p tcp --dport 22 -j NOTRACK
Los comandos de ejemplo deshabilitan el seguimiento de conexiones para todo el tráfico UDP y para el tráfico TCP en el puerto 22. Estas reglas son ejemplos. Configúrelas según sus requisitos específicos y su entorno.