Solución 1:
Honestamente, no usaría Ubuntu para esto... pero hay opciones que se pueden aplicar a cualquier variante de Linux.
Querrá aumentar sus búferes 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 programador/elevador (por ejemplo, el deadline
ascensor).
En el nivel del servidor, puede modificar el regulador de la CPU y la administración de la potencia y la frecuencia de la CPU (P-States, C-States).
A nivel del sistema operativo, puede cambiar la prioridad en tiempo real de su aplicación (chrt
), optimizando para reducir las interrupciones, fijándolo a una CPU o grupo de CPU (taskset
), y deteniendo cualquier servicio o daemon 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.
Solución 2:
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 varias aplicaciones al mismo tiempo de manera justa e intenta evitar el agotamiento de recursos y usted apuntará a lo contrario, privar a todo lo demás excepto a su aplicación. 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 buscando un kernel en tiempo real.
Normalmente, TCP/IP se ajusta para evitar caídas de conexión y hacer un uso eficiente del ancho de banda disponible. Para obtener la menor latencia posible de un enlace muy rápido, en lugar de obtener el mayor ancho de banda posible de una conexión en la que algunos enlaces intermedios están más restringidos, ajustará el ajuste de la pila de red.
sysctl -a
le mostrará una gran cantidad de configuraciones de núcleos 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:compatibilidad con tamaños de ventana IPV4 TCP superiores a 64 000; por lo general, se necesita en redes de gran ancho de banda.net.ipv4.tcp_reordering=3
Las veces máximas que se puede reordenar un paquete IPV4 en un flujo de paquetes TCP sin que TCP asuma la pérdida del paquete y pase a un inicio lento.net.ipv4.tcp_low_latency=1
destinado a dar preferencia a la baja latencia sobre un mayor rendimiento; configuración =1 deshabilita el procesamiento de precola IPV4 tcpnet.ipv4.tcp_sack=0
establecer en 1 habilita el reconocimiento selectivo para IPV4, lo que requiere habilitar tcp_timestamps y agrega algunos gastos generales de paquetes, que no necesita si no experimenta pérdida de paquetesnet.ipv4.tcp_timestamps=0
Sólo se aconseja en los casos en que se necesite 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 el código fuente del kernel.
Por supuesto, puede codificar sockets TCP sin procesar y en gran medida omitir la pila TCP/IP del kernel por completo.
A menudo, los sistemas altamente optimizados se ejecutan en una red confiable y tendrán sus firewalls locales (iptables) deshabilitados.