Este tema describe los parámetros de red comunes del kernel de Linux y ofrece soluciones para los problemas relacionados.
Herramienta de diagnóstico autogestionado
La herramienta de diagnóstico autogestionado de Alibaba Cloud le permite verificar rápidamente la configuración de los parámetros del kernel y genera un informe de diagnóstico detallado.
Click to open the Self-service Troubleshooting page and select the target region.
El informe de diagnóstico puede mostrar una anomalía como Inbound rules for common ports are not configured in the security group. En concreto, no se permite el tráfico entrante para el protocolo ICMP en el puerto -1, lo que impide que la instancia responda a las solicitudes PING. Para solucionarlo, modifique las reglas del security group para permitir el tráfico en el puerto correspondiente.
Si la herramienta de diagnóstico autogestionado no identifica su problema, continúe con los siguientes pasos para realizar la solución de problemas manualmente.
Consultar y modificar parámetros del kernel
Notas de uso
Antes de modificar los parámetros del kernel, tenga en cuenta lo siguiente:
Modifique los parámetros del kernel únicamente según sus requisitos específicos y con datos que lo respalden. Evite realizar ajustes arbitrarios.
Comprenda la función de cada parámetro. Tenga en cuenta que los parámetros del kernel pueden variar según el entorno y la versión. Para obtener más información, consulte Common Linux kernel parameters.
Realice una copia de seguridad de los datos importantes en su instancia ECS. Para obtener más información, consulte Create a snapshot.
Modificar parámetros
Puede utilizar tanto /proc/sys/ como /etc/sysctl.conf para modificar los parámetros del kernel mientras una instancia está en ejecución. Las diferencias son las siguientes:
El directorio
/proc/sys/es un sistema de archivos virtual que proporciona acceso a los parámetros del kernel. El subdirectorionetcontiene todos los parámetros de red del kernel habilitados para el sistema actual. Puede modificar estos parámetros en tiempo de ejecución, pero los cambios no persisten después de reiniciar la instancia. Este método se utiliza normalmente para probar cambios de forma temporal.El archivo
/etc/sysctl.confes un archivo de configuración. Puede modificar el archivo/etc/sysctl.confpara cambiar los valores predeterminados de los parámetros del kernel. Los cambios persisten después de reiniciar la instancia.
Los archivos del directorio /proc/sys/ corresponden a los nombres de los parámetros en el archivo /etc/sysctl.conf. Por ejemplo, el parámetro net.ipv4.tcp_tw_recycle corresponde al archivo /proc/sys/net/ipv4/tcp_tw_recycle, y el contenido del archivo es el valor del parámetro.
La configuración de tcp_tw_recycle, que incluye el ajuste net.ipv4.tcp_tw_recycle en sysctl.conf, se eliminó de Linux a partir de la versión 4.12 del kernel. Solo puede utilizar el parámetro net.ipv4.tcp_tw_recycle si su sistema ejecuta una versión del kernel anterior a la 4.12.
Uso de /proc/sys/
-
Inicie sesión en la instancia ECS Linux.
Para obtener más información, consulte Overview of connection methods for ECS instances.
-
Utilice el comando
catpara consultar el contenido del archivo correspondiente.Por ejemplo, ejecute el siguiente comando para consultar el valor de
net.ipv4.tcp_tw_recycle:cat /proc/sys/net/ipv4/tcp_tw_recycle -
Utilice el comando
echopara modificar el parámetro del kernel.Por ejemplo, ejecute el siguiente comando para cambiar el valor de
net.ipv4.tcp_tw_recyclea 0:echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle
Uso de /etc/sysctl.conf
-
Inicie sesión en la instancia ECS Linux.
Para obtener más información, consulte Overview of connection methods for ECS instances.
-
Ejecute el siguiente comando para consultar todos los parámetros que están actualmente en vigor:
sysctl -aA continuación se muestra una salida de ejemplo parcial:
net.ipv4.tcp_app_win = 31 net.ipv4.tcp_adv_win_scale = 2 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_frto = 2 net.ipv4.tcp_frto_response = 0 net.ipv4.tcp_low_latency = 0 net.ipv4.tcp_no_metrics_save = 0 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_tso_win_divisor = 3 net.ipv4.tcp_congestion_control = cubic net.ipv4.tcp_abc = 0 net.ipv4.tcp_mtu_probing = 0 net.ipv4.tcp_base_mss = 512 net.ipv4.tcp_workaround_signed_windows = 0 net.ipv4.tcp_challenge_ack_limit = 1000 net.ipv4.tcp_limit_output_bytes = 262144 net.ipv4.tcp_dma_copybreak = 4096 net.ipv4.tcp_slow_start_after_idle = 1 net.ipv4.cipso_cache_enable = 1 net.ipv4.cipso_cache_bucket_size = 10 net.ipv4.cipso_rbm_optfmt = 0 net.ipv4.cipso_rbm_strictvalid = 1 -
Modifique los parámetros del kernel.
-
Para realizar un cambio temporal:
/sbin/sysctl -w kernel.parameter="[value]"NotaReemplace
kernel.parametercon el nombre del parámetro del kernel y[value]con el valor deseado. Por ejemplo, ejecute el comandosysctl -w net.ipv4.tcp_tw_recycle="0"para cambiar el valor del parámetro del kernelnet.ipv4.tcp_tw_recyclea 0. -
Para realizar un cambio permanente:
-
Ejecute el siguiente comando para abrir el archivo de configuración
/etc/sysctl.conf:vim /etc/sysctl.conf Presione la tecla
ipara entrar en el modo de edición.-
Modifique los parámetros del kernel según sea necesario.
El siguiente ejemplo muestra el formato requerido:
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 Presione la tecla
Esc, introduzca:wqy presione Enter para guardar el archivo y salir.-
Ejecute el siguiente comando para aplicar los cambios:
/sbin/sysctl -p
-
-
Problemas comunes de parámetros de red
Why does the "Time wait bucket table overflow" error message appear in the /var/log/messages log?
Why are there many TCP connections in the FIN_WAIT2 state on a Linux ECS instance?
Why are there many TCP connections in the CLOSE_WAIT state on a Linux ECS instance?
Why can't a client access a server-side ECS or ApsaraDB RDS instance after NAT is configured?
Fallo de conexión remota: "nf_conntrack: table full, dropping packet"
Síntomas
No puede conectarse remotamente a una instancia ECS. Al hacer ping a la instancia de destino, se produce pérdida de paquetes o fallo. El siguiente mensaje de error aparece frecuentemente en el registro del sistema /var/log/message:
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Causa
ip_conntrack es un módulo de Linux que rastrea las entradas de conexión para NAT. El módulo utiliza una tabla hash para registrar las entradas de established connection TCP. Cuando esta tabla hash se llena, se descartan los paquetes de nuevas conexiones, lo que provoca el error nf_conntrack: table full, dropping packet.
El sistema Linux asigna un espacio de memoria para mantener cada conexión TCP. El tamaño de este espacio lo determinan los parámetros nf_conntrack_buckets y nf_conntrack_max. El valor predeterminado de este último es cuatro veces el valor del primero. Por lo tanto, se recomienda aumentar el valor del parámetro nf_conntrack_max.
Mantener las conexiones del sistema consume una gran cantidad de memoria. Se recomienda aumentar el valor del parámetro nf_conntrack_max solo cuando el sistema esté inactivo y disponga de suficiente memoria.
Solución
-
Conéctese a la instancia mediante VNC.
Para obtener más información, consulte Log on to a Linux instance using password authentication.
-
Modifique el valor del parámetro
nf_conntrack_max.-
Ejecute el siguiente comando para abrir el archivo
/etc/sysctl.conf:vi /etc/sysctl.conf Presione la tecla
ipara entrar en el modo de edición.-
Modifique el valor del parámetro
nf_conntrack_max.Por ejemplo, cambie el número máximo de entradas de la tabla hash a
655350:net.netfilter.nf_conntrack_max = 655350 Presione la tecla
Esc, introduzca:wqy presione Enter para guardar el archivo y salir.
-
-
Modifique el valor del parámetro de tiempo de espera
nf_conntrack_tcp_timeout_established.Por ejemplo, cambie el valor del parámetro de tiempo de espera a 1200. El tiempo de espera predeterminado es de 432 000 segundos.
net.netfilter.nf_conntrack_tcp_timeout_established = 1200 -
Ejecute el siguiente comando para aplicar los cambios:
sysctl -p
Error "Time wait bucket table overflow"
Síntomas
El mensaje de error "kernel: TCP: time wait bucket table overflow" aparece frecuentemente en /var/log/messages de una instancia ECS Linux.
Feb 18 12:28:38 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:44 i-*** kernel: printk: 227 messages suppressed.
Feb 18 12:28:44 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:52 i-*** kernel: printk: 121 messages suppressed.
Feb 18 12:28:52 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:53 i-*** kernel: printk: 351 messages suppressed.
Feb 18 12:28:53 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:59 i-*** kernel: printk: 319 messages suppressed.
Causa
El parámetro net.ipv4.tcp_max_tw_buckets controla el número de conexiones en estado TIME_WAIT que el kernel puede gestionar. Cuando el número total de conexiones en estado TIME_WAIT y de conexiones a punto de pasar a dicho estado supera el valor del parámetro net.ipv4.tcp_max_tw_buckets, aparece el mensaje de error "kernel: TCP: time wait bucket table overflow" en /var/log/messages. A continuación, el kernel cierra las conexiones TCP excedentes.
Solución
Puede aumentar el valor del parámetro net.ipv4.tcp_max_tw_buckets según sea necesario. Además, se recomienda optimizar las conexiones TCP a nivel de aplicación. Este tema describe cómo modificar el valor del parámetro net.ipv4.tcp_max_tw_buckets.
-
Conéctese a la instancia mediante VNC.
Para obtener más información, consulte Log on to a Linux instance using password authentication.
-
Ejecute el siguiente comando para comprobar el número de conexiones TCP:
netstat -antp | awk 'NR>2 {print $6}' | sort | uniq -cLa siguiente salida indica que hay 6300 conexiones en estado TIME_WAIT:
6300 TIME_WAIT 40 LISTEN 20 ESTABLISHED 20 CONNECTED -
Ejecute el siguiente comando para consultar el valor del parámetro
net.ipv4.tcp_max_tw_buckets:cat /etc/sysctl.conf | grep net.ipv4.tcp_max_tw_bucketsLa salida indica que el valor del parámetro
net.ipv4.tcp_max_tw_bucketses 20000.net.ipv4.tcp_max_tw_buckets = 20000 -
Modifique el valor del parámetro
net.ipv4.tcp_max_tw_buckets.-
Ejecute el siguiente comando para abrir el archivo
/etc/sysctl.conf:vi /etc/sysctl.conf Presione la tecla
ipara entrar en el modo de edición.-
Modifique el valor del parámetro
net.ipv4.tcp_max_tw_buckets.Por ejemplo, cambie el valor del parámetro
net.ipv4.tcp_max_tw_bucketsa65535:net.ipv4.tcp_max_tw_buckets = 65535 Presione la tecla
Esc, introduzca:wqy presione Enter para guardar el archivo y salir.
-
-
Ejecute el siguiente comando para aplicar los cambios:
sysctl -p
Alto número de conexiones en estado FIN_WAIT2
Síntomas
Un gran número de conexiones TCP en la instancia ECS Linux se encuentran en estado FIN_WAIT2.
Causa
Este problema puede ocurrir por las siguientes razones:
En un servicio HTTP, el servidor podría cerrar proactivamente una conexión por un motivo específico, como un tiempo de espera de KEEPALIVE. Cuando el servidor cierra la conexión, esta entra en estado FIN_WAIT2.
La pila de protocolos TCP/IP admite conexiones semiabiertas. A diferencia del estado TIME_WAIT, el estado FIN_WAIT2 no tiene tiempo de espera. Si el cliente no cierra su extremo de la conexión, esta permanece en estado FIN_WAIT2 hasta que se reinicia el sistema. Un número creciente de conexiones FIN_WAIT2 puede provocar que el kernel falle.
Solución
Disminuya el valor de net.ipv4.tcp_fin_timeout para cerrar más rápidamente las conexiones TCP en estado FIN_WAIT2.
-
Conéctese a la instancia mediante VNC.
Para obtener más información, consulte Log on to a Linux instance using password authentication.
-
Modifique el valor del parámetro
net.ipv4.tcp_fin_timeout.-
Ejecute el siguiente comando para abrir el archivo
/etc/sysctl.conf:vi /etc/sysctl.conf Presione la tecla
ipara entrar en el modo de edición.-
Modifique el valor del parámetro
net.ipv4.tcp_fin_timeout.Por ejemplo, cambie el valor del parámetro
net.ipv4.tcp_fin_timeouta 10:net.ipv4.tcp_fin_timeout = 10 Presione la tecla
Esc, introduzca:wqy presione Enter para guardar el archivo y salir.
-
-
Ejecute el siguiente comando para aplicar los cambios:
sysctl -p
Alto número de conexiones en estado CLOSE_WAIT
Síntomas
Un gran número de conexiones TCP en la instancia ECS Linux se encuentran en estado CLOSE_WAIT.
Causa
Este problema puede ocurrir cuando el número de conexiones en estado CLOSE_WAIT supera el rango normal.
TCP utiliza un saludo de cuatro vías para finalizar una conexión. Cualquiera de los extremos de una conexión TCP puede iniciar la solicitud de cierre. Si el par remoto inicia el cierre, pero la aplicación local no cierra su extremo del socket, la conexión entra en estado CLOSE_WAIT. Aunque se trata de un estado semicerrado, la conexión ya no es utilizable para la comunicación y debe finalizarse rápidamente.
Solución
Se recomienda revisar la lógica de su aplicación para asegurarse de que gestiona correctamente las conexiones cerradas por el par remoto. La aplicación debe cerrar rápidamente su socket y realizar las comprobaciones pertinentes.
-
Conéctese a la instancia ECS.
Para obtener más información, consulte Overview of connection methods for ECS instances.
-
Compruebe y cierre las conexiones TCP que se encuentran en estado CLOSE_WAIT dentro de su aplicación.
Las funciones de lectura y escritura en la mayoría de los lenguajes de programación pueden detectar una conexión en estado CLOSE_WAIT. Los siguientes ejemplos muestran cómo cerrar una conexión en Java y C:
-
Java
Utilice el método
read()para comprobar el final del flujo. Cuando el método devuelve-1, indica que el par ha cerrado su extremo.Llame al método
close()para cerrar la conexión.
-
C
Compruebe el valor de retorno de la llamada al sistema
read().Si el valor de retorno es 0, el par ha cerrado la conexión. Ahora puede cerrar el socket.
Si el valor de retorno es menor que 0, compruebe
errno. Si el error no esEAGAINoEWOULDBLOCK, se ha producido un error y debe cerrar el socket.
-
Fallo de acceso tras configurar NAT
Síntomas
Después de configurar NAT en el lado del cliente, este no puede acceder a instancias ECS o ApsaraDB RDS del lado del servidor. Esto incluye instancias ECS en una VPC configuradas con SNAT.
Causa
Este problema puede ocurrir si tanto el parámetro net.ipv4.tcp_tw_recycle como net.ipv4.tcp_timestamps están establecidos en 1 en el servidor.
Cuando los parámetros del kernel del servidor net.ipv4.tcp_tw_recycle y net.ipv4.tcp_timestamps están ambos habilitados (establecidos en 1), el servidor comprueba la marca de tiempo de cada paquete TCP entrante. Si la marca de tiempo de un nuevo paquete no es mayor que la última marca de tiempo registrada de ese endpoint, el servidor descarta el paquete.
Solución
Elija la solución según el producto en la nube del lado del servidor.
Si el servidor remoto es una instancia ECS, establezca tanto el parámetro
net.ipv4.tcp_tw_recyclecomonet.ipv4.tcp_timestampsen 0 en la instancia ECS.Si el servidor remoto es una instancia ApsaraDB RDS, no puede modificar directamente sus parámetros del kernel. En su lugar, debe establecer tanto el parámetro
net.ipv4.tcp_tw_recyclecomonet.ipv4.tcp_timestampsen 0 en la máquina cliente.
-
Conéctese a la instancia mediante VNC.
Para obtener más información, consulte Log on to a Linux instance using password authentication.
-
Cambie los valores de los parámetros
net.ipv4.tcp_tw_recycleynet.ipv4.tcp_timestampsa 0.-
Ejecute el siguiente comando para abrir el archivo
/etc/sysctl.conf:vi /etc/sysctl.conf Presione la tecla
ipara entrar en el modo de edición.-
Cambie los valores de los parámetros
net.ipv4.tcp_tw_recycleynet.ipv4.tcp_timestampsa 0.net.ipv4.tcp_tw_recycle=0 net.ipv4.tcp_timestamps=0 Presione la tecla
Esc, introduzca:wqy presione Enter para guardar el archivo y salir.
-
-
Ejecute el siguiente comando para aplicar los cambios:
sysctl -p
Parámetros comunes del kernel de Linux
|
Parámetro |
Descripción |
|
net.core.rmem_default |
Tamaño predeterminado del búfer de recepción del socket, en bytes. |
|
net.core.rmem_max |
Tamaño máximo del búfer de recepción del socket, en bytes. |
|
net.core.wmem_default |
Tamaño predeterminado del búfer de envío del socket, en bytes. |
|
net.core.wmem_max |
Tamaño máximo del búfer de envío del socket, en bytes. |
|
net.core.netdev_max_backlog |
Especifica el número máximo de paquetes que se pueden poner en cola en la cola de entrada de la interfaz de red. Esta cola retiene los paquetes cuando la interfaz de red recibe paquetes más rápido de lo que el kernel puede procesarlos. |
|
net.core.somaxconn |
Parámetro global que define la longitud máxima de la cola de escucha para cada puerto. Este parámetro está relacionado con |
|
net.core.optmem_max |
Especifica el tamaño máximo del búfer auxiliar permitido por socket. |
|
net.ipv4.tcp_mem |
Determina cómo gestiona la pila TCP el uso de memoria. Cada valor se expresa en unidades de páginas de memoria (normalmente 4 KB).
|
|
net.ipv4.tcp_rmem |
Define la memoria reservada para los búferes de recepción TCP.
|
|
net.ipv4.tcp_wmem |
Define la memoria reservada para los búferes de envío TCP.
|
|
net.ipv4.tcp_keepalive_time |
Intervalo en segundos entre los sondeos keepalive TCP enviados para verificar que una conexión sigue activa. |
|
net.ipv4.tcp_keepalive_intvl |
Intervalo en segundos entre reintentos si no se confirma un sondeo keepalive. |
|
net.ipv4.tcp_keepalive_probes |
Número máximo de sondeos keepalive que se envían antes de considerar que una conexión TCP está inactiva. |
|
net.ipv4.tcp_sack |
Habilita Selective Acknowledgment (SACK). Un valor de 1 lo habilita. Esta función mejora el rendimiento al permitir que el receptor confirme paquetes desordenados, de modo que el remitente solo retransmite los segmentos faltantes. Esta opción se recomienda para comunicaciones de red de área amplia (WAN), pero aumenta el uso de CPU. |
|
net.ipv4.tcp_timestamps |
Habilita las marcas de tiempo TCP, que añaden 12 bytes a la cabecera TCP. Las marcas de tiempo permiten cálculos de tiempo de ida y vuelta (RTT) más precisos que el mecanismo de tiempo de espera de retransmisión (consulte RFC 1323). Esta opción debe estar habilitada para mejorar el rendimiento. |
|
net.ipv4.tcp_window_scaling |
Habilita el escalado de ventanas según se define en RFC 1323. Establézcalo en 1 para admitir ventanas TCP mayores de 64 KB, hasta un máximo de 1 GB. Esta opción solo surte efecto si ambos extremos de la conexión TCP la habilitan. |
|
net.ipv4.tcp_syncookies |
Este parámetro especifica si se habilitan las cookies SYN TCP (
|
|
net.ipv4.tcp_tw_reuse |
Permite reutilizar sockets en estado TIME-WAIT para nuevas conexiones TCP. |
|
net.ipv4.tcp_tw_recycle |
Habilita el reciclaje rápido de sockets TIME-WAIT. |
|
net.ipv4.tcp_fin_timeout |
Tiempo en segundos que una conexión permanece en estado FIN-WAIT-2 en el extremo local después de cerrar un socket. El extremo remoto podría desconectarse, no cerrar nunca la conexión o finalizar inesperadamente. |
|
net.ipv4.ip_local_port_range |
Especifica el rango de números de puerto locales que pueden utilizar los protocolos TCP/UDP. |
|
net.ipv4.tcp_max_syn_backlog |
Determina el número máximo de solicitudes de conexión en cola en estado Una conexión se encuentra en estado |
|
net.ipv4.tcp_westwood |
Habilita el algoritmo de control de congestión Westwood+ en el lado del remitente. Optimiza la utilización del ancho de banda manteniendo una estimación del throughput disponible. Esta opción se recomienda para comunicaciones WAN. |
|
net.ipv4.tcp_bic |
Habilita el control de congestión Binary Increase (BIC) para redes rápidas y de larga distancia. Esto permite una mejor utilización de enlaces de velocidad gigabit. Esta opción se recomienda para comunicaciones WAN. |
|
net.ipv4.tcp_max_tw_buckets |
Establece el número máximo de sockets en estado TIME_WAIT. Si se supera este límite, se cierran inmediatamente. El valor predeterminado depende de la memoria de la instancia, con un máximo de 262 144. |
|
net.ipv4.tcp_synack_retries |
Especifica el número de veces que se retransmite un paquete SYN+ACK para una conexión en estado |
|
net.ipv4.tcp_abort_on_overflow |
Si se establece en 1, el sistema envía un paquete de reinicio (RST) para finalizar conexiones cuando la aplicación no puede procesar un alto volumen de solicitudes entrantes en poco tiempo. Se recomienda optimizar el rendimiento de la aplicación en lugar de simplemente restablecer conexiones. El valor predeterminado es 0. |
|
net.ipv4.route.max_size |
Tamaño máximo de la caché de enrutamiento del kernel. |
|
net.ipv4.ip_forward |
Habilita el reenvío de paquetes entre interfaces. |
|
net.ipv4.ip_default_ttl |
Valor predeterminado de Time To Live (TTL) para los paquetes salientes. |
|
net.netfilter.nf_conntrack_tcp_timeout_established |
Tiempo de espera en segundos para conexiones TCP establecidas que no tienen actividad. |
|
net.netfilter.nf_conntrack_max |
Número máximo de entradas en la tabla de seguimiento de conexiones. |