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?
Respuestas:
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:
Si la aplicación está escribiendo en el disco, tal vez sea necesario un cambio de planificador / elevador (por ejemplo, el
deadline
elevador).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.
fuente
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.
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 bandanet.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=1
destinado a dar preferencia a la baja latencia sobre el mayor rendimiento; setting = 1 deshabilita el procesamiento previo de IPv4 tcpnet.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 packetlossnet.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.
fuente