Red Hat Training

A Red Hat training course is available for RHEL 8

21.2. Cuellos de botella en la recepción de paquetes

Aunque la pila de red se autooptimiza en gran medida, hay una serie de puntos durante el procesamiento de paquetes de red que pueden convertirse en cuellos de botella y reducir el rendimiento. A continuación se detallan los problemas que pueden provocar cuellos de botella:

The buffer or ring buffer of the network card
El buffer de hardware puede ser un cuello de botella si el kernel deja caer un gran número de paquetes. Utiliza la utilidad ethtool para monitorizar un sistema en busca de paquetes perdidos.
The hardware or software interrupt queues
Las interrupciones pueden aumentar la latencia y la contención del procesador. Para obtener información sobre cómo el procesador maneja las interrupciones, consulte Configuración de sistemas de afinidad de interrupciones.
The socket receive queue of the application
Un gran número de paquetes que no se copian o por un aumento de los errores de entrada UDP (InErrors) en el archivo /proc/net/snmp, indica un cuello de botella en la cola de recepción de una aplicación.

Si el búfer del hardware deja caer un gran número de paquetes, las siguientes son las posibles soluciones:

Slow the input traffic
Filtrar el tráfico entrante, reducir el número de grupos de multidifusión unidos o reducir la cantidad de tráfico de difusión para disminuir la velocidad de llenado de la cola.
Resize the hardware buffer queue

Redimensionar la cola del buffer de hardware: Reduzca el número de paquetes que se pierden aumentando el tamaño de la cola para que no se desborde tan fácilmente. Puedes modificar los parámetros de rx/tx del dispositivo de red con el comando ethtool:

ethtool --set-ring device-name value

Change the drain rate of the queue
  • Disminuya la velocidad de llenado de la cola filtrando o descartando paquetes antes de que lleguen a la cola, o disminuyendo el peso del dispositivo. Filtra el tráfico entrante o baja el peso del dispositivo de la tarjeta de interfaz de red para ralentizar el tráfico entrante.

    El peso del dispositivo se refiere al número de paquetes que un dispositivo puede recibir a la vez en un solo acceso programado del procesador. Se puede aumentar la velocidad de vaciado de una cola incrementando su peso de dispositivo que está controlado por el parámetro del kernel dev_weight. Para alterar temporalmente este parámetro, cambie el contenido del archivo /proc/sys/net/core/dev_weight, o para alterarlo permanentemente, utilice el comando sysctl, que es proporcionado por el paquete procps-ng.

  • Aumentar la longitud de la cola de sockets de la aplicación: Esta suele ser la forma más fácil de mejorar la tasa de drenaje de una cola de sockets, pero es poco probable que sea una solución a largo plazo. Si una cola de sockets recibe una cantidad limitada de tráfico en ráfagas, aumentar la profundidad de la cola de sockets para que coincida con el tamaño de las ráfagas de tráfico puede evitar que se pierdan paquetes. Para aumentar la profundidad de una cola, aumenta el tamaño del buffer de recepción del socket haciendo cualquiera de los siguientes cambios:

    • Aumenta el valor del parámetro /proc/sys/net/core/rmem_default: Este parámetro controla el tamaño por defecto del buffer de recepción utilizado por los sockets. Este valor debe ser menor o igual que el valor del parámetro proc/sys/net/core/rmem_max.
    • Utilice setsockopt para configurar un valor mayor de SO_RCVBUF: Este parámetro controla el tamaño máximo en bytes del buffer de recepción de un socket. Utilice la llamada al sistema getsockopt para determinar el valor actual del búfer.

Alterar la tasa de drenaje de una cola suele ser la forma más sencilla de mitigar el bajo rendimiento de la red. Sin embargo, aumentar el número de paquetes que un dispositivo puede recibir a la vez utiliza tiempo adicional del procesador, durante el cual no se pueden programar otros procesos, por lo que esto puede causar otros problemas de rendimiento.

Recursos adicionales

  • Para más información, consulte las páginas de manual ss, socket, y ethtool.
  • El archivo /proc/net/snmp.