Configuración TCP de baja latencia en Ubuntu

10

Hay un servidor para mediciones que se ejecuta en Ubuntu en mi laboratorio. Y hay un programa C, que recibe datos a través de la conexión TCP y debe enviar una respuesta lo antes posible.

Configuración

  • CPU: 2 procesadores x 4 núcleos - Intel (R) Xeon (R) CPU E5345 @ 2.33GHz
  • RAM: 12 GB
  • NIC: Controlador Gigabit Ethernet Intel Corporation 80003ES2LAN / Controlador Gigabit Ethernet 82546EB
  • Conmutador de red: Cisco Catalyst 2960
  • Información de datos: los bloques de datos vienen aprox. cada 10 milisegundos. El tamaño del bloque de datos es de aprox. 1000 bytes.

La latencia de la red cuando se reciben paquetes es muy crítica (decenas de microsegundos son importantes). Optimicé el programa al máximo, pero no tengo experiencia en ajustar Ubuntu.

¿Qué se puede configurar en Ubuntu para reducir el retraso local del procesamiento / envío de paquetes?

Alex V
fuente
Sí, me gustaría saber la marca / modelo del servidor.
ewwhite
deberías cavar mucho más profundo. lea algunas cosas sobre la optimización del kernel para el comercio de alta frecuencia. Fe una venta de Cisco Paper: cisco.com/c/dam/en/us/products/collateral/switches/… así que obtener una tarjeta PCI-E decente en ambos lados también ahorrará algo. Lo más probable (dependiendo de cuánto tiempo quieras dedicar a esto) reconstruirás al menos el kernel con diferentes configuraciones, eliminando muchas cosas que ubuntu necesita, pero tú no. Entonces, como ewwhite escribió en los comentarios, ubuntu podría no ser perfecto para las configuraciones más bajas.
Dennis Nolte
Con el hardware en la lista, es un equipo de la era 2008 (CPU de la serie Intel 5300). En aquel entonces, no había demasiados cambios especiales de hardware de baja latencia posibles. Configurar el BIOS del sistema para que se ejecute en modo de alto rendimiento y deshabilitar los estados C de la CPU.
ewwhite
@ewwhite Sí, tienes razón sobre los equipos de la era 2008. Probaré tus sugerencias. ¡Gracias!
Alex V
¿Alguna posibilidad de modificar este software para TCP_NODELAY?
Matt

Respuestas:

10

Honestamente, no estaría usando Ubuntu para esto ... pero hay opciones que se pueden aplicar a cualquier variante de Linux.

Querrá aumentar sus buffers de pila de red:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

Si la aplicación está escribiendo en el disco, tal vez sea necesario un cambio de planificador / elevador (por ejemplo, el deadlineelevador).

A nivel del servidor, puede modificar el regulador de la CPU y la administración de energía y frecuencia de la CPU (Estados P, Estados C).

En el nivel del sistema operativo, puede cambiar la prioridad en tiempo real de su aplicación ( chrt), optimizando para reducir las interrupciones, fijándola a una CPU o grupo de CPU ( taskset), y deteniendo cualquier servicio o demonio innecesario.

También puede ver algunas sugerencias en: Cómo solucionar problemas de latencia entre 2 hosts Linux

Es difícil ser más específico sin conocer el hardware o el equipo de red involucrado.

ewwhite
fuente
3
Este no es realmente el lugar apropiado para los debates religiosos. Tómelo en otro lugar, como el chat.
Michael Hampton
1
@MichaelHampton Hubo enlaces interesantes en la discusión relacionados con la pregunta: Red Hat Realtime Tuning Guide .
Alex V
6

Si va por la ruta del alto rendimiento, normalmente querrá ejecutar la menor cantidad posible de otros procesos (programados), ya que interferirán con su aplicación.

Linux, al igual que los sistemas operativos UNIX clásicos, está diseñado para ejecutar múltiples aplicaciones al mismo tiempo de manera justa y trata de evitar el agotamiento de los recursos. Los pasos simples a nivel del sistema operativo están cambiando el nivel agradable y la prioridad en tiempo real de su aplicación, cambiando el programador o eligiendo un núcleo en tiempo real .

TCP / IP generalmente se ajusta para evitar caídas de conexión y hacer un uso eficiente del ancho de banda disponible. Para obtener la latencia más baja posible de un enlace muy rápido, en lugar de obtener el mayor ancho de banda posible de una conexión donde algunos enlaces intermedios están más restringidos, va a ajustar el ajuste de la pila de red.

 sysctl -a 

le mostrará una gran cantidad de configuraciones de kernel que puede ajustar. La configuración depende de si está utilizando o no IPv4 o IPv6 y qué es exactamente lo que ya hace en su aplicación, pero puede ser de interés:

  • net.ipv4.tcp_window_scaling=1 RFC 1323: soporte para ventanas de TCP IPV4 de más de 64 K, generalmente necesario en redes de gran ancho de banda
  • net.ipv4.tcp_reordering=3 El número máximo de veces que se puede reordenar un paquete IPV4 en una secuencia de paquetes TCP sin que TCP suponga la pérdida de paquetes y se inicie lentamente.
  • net.ipv4.tcp_low_latency=1destinado a dar preferencia a la baja latencia sobre el mayor rendimiento; setting = 1 deshabilita el procesamiento previo de IPv4 tcp
  • net.ipv4.tcp_sack=0 establecer a 1 habilita el reconocimiento selectivo para IPV4, lo que requiere habilitar tcp_timestamps y agrega algo de sobrecarga de paquetes, que no necesita si no experimenta packetloss
  • net.ipv4.tcp_timestamps=0 Solo aconsejado en casos donde se necesita saco.
  • net.ipv4.tcp_fastopen=1 Habilite para enviar datos en el paquete SYN de apertura.

La mayoría, si no todos, están mejor documentados en la fuente del núcleo .

Por supuesto, puede codificar sockets TCP sin procesar y omitir la pila TCP / IP del núcleo por completo.

A menudo, los sistemas altamente sintonizados se ejecutan en una red confiable y tendrán sus firewalls locales (iptables) deshabilitados.

HBruijn
fuente