web-dev-qa-db-fra.com

Latence faible TCP Paramètres sur Ubuntu

Il existe un serveur pour les mesures en cours d'exécution sur Ubuntu dans mon laboratoire. Et il y a un programme C, qui reçoit des données via TCP connexion et doit dès que possible envoyer une réponse.

Configuration

  • CPU: 2 processeurs x 4 cœurs - Intel (R) Xeon (R) CPU E5345 @ 2.33GHz
  • RAM: 12 Go
  • NIC: Intel Corporation 80003es2lan Gigabit Ethernet Controller/82546EB Contrôleur Ethernet Gigabit
  • Commutateur réseau: Cisco Catalyst 2960
  • Info de données: Les blocs de données viennent env. chaque 10 millisecondes. La taille du bloc de données est d'env. 1000 octets.

La latence de réseau lors de la réception de paquets est très critique (des dizaines de microsecondes sont importants). J'ai optimisé le programme au maximum, mais je n'ai aucune expérience ajusteuse Ubuntu.

Qu'est-ce qui peut être configuré à Ubuntu pour réduire le retard local des paquets de traitement/d'envoi?

10
Alex V

Si vous allez typiquement la voie de haute performance, vous voudrez généralement exécuter le moins d'autres processus (planifiés) que possible avec votre application.

Linux, à l'instar des systèmes d'exploitation Unix classiques, est conçu pour exécuter plusieurs applications simultanément de manière juste et tente d'empêcher la famine de ressources et de visant le contraire, affamer tout le reste, sauf votre application. Les étapes simples au niveau du système d'exploitation changent le Nice Niveau et priorité en temps réel de votre application, modifiant le planificateur ou aller pour un au noyau en temps réel .

TCP/IP est typiquement à l'écoute pour empêcher les gouttes de connexion et utiliser efficacement la bande passante disponible. Pour obtenir la latence la plus basse possible d'un lien très rapide, plutôt que d'obtenir la largeur de bande la plus élevée possible d'une connexion lorsque certains liens intermédiaires sont plus contraints, vous allez ajuster le réglage de la pile de réseau.

 sysctl -a 

vous montrera une foule de paramètres des noyaux que vous pouvez syntoniser. Les paramètres dépendent de l'utilisation ou non de l'IPv4 ou de l'IPv6 et de ce que vous faites exactement dans votre application, mais d'intérêt peut être:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - Prise en charge de IPv4 TCP Tailles de fenêtre supérieures à 64K - généralement nécessaires sur des réseaux à bande passante élevée
  • net.ipv4.tcp_reordering=3 Le paquet maximum qu'un paquet IPv4 peut être réorganisé dans un TCP sans TCP en supposant la perte de paquets et passe au début lent.
  • net.ipv4.tcp_low_latency=1 destiné à donner la préférence à une faible latence sur un débit supérieur; Réglage = 1 désactive le traitement Prequeue IPv4 TCP
  • net.ipv4.tcp_sack=0 Réglage sur 1 Active l'accusé de réception sélective pour IPv4, qui nécessite une activation de TCP_TIMESTAMPS et ajoute des frais généraux de paquets, que vous n'avez pas besoin si vous n'étudiez pas PacketLoss
  • net.ipv4.tcp_timestamps=0 Uniquement conseillé dans les cas où le sac est nécessaire.
  • net.ipv4.tcp_fastopen=1 Activez d'envoyer des données dans le paquet SYN de l'ouverture.

La plupart des personnes ne sont pas toutes documentées dans la source du noyau .

Vous pouvez bien sûr le code RAW TCP sockets et en grande partie par passez complètement la pile TCP/IP du noyau.

Souvent, des systèmes hautement accordés fonctionnent dans un réseau de confiance et auront leurs pare-feu locaux (IPtables) désactivés.

6
HBruijn