J’utilise tcp pour de nombreux petits envois, devrais-je désactiver l’algorithme Nagles? (Les gens le savent aussi comme TCP_NODELAY)

J’ai refait ce post parce que mon choix de titre était horrible, désolé pour ça. Mon nouveau message peut être trouvé ici: Après avoir envoyé beaucoup, mon appel send () provoque le blocage complet de mon programme. Comment est-ce possible?

Merci beaucoup à tous. Le problème était que les clients sont en fait des robots et qu’ils ne lisent jamais les connexions. (Se sent stupide)

TCP_NODELAY peut aider la latence des petits paquets de l’expéditeur au destinataire, mais la description que vous avez donnée dans des directions différentes. Je peux imaginer ce qui suit:

  • Envoi de plus de données que les récepteurs consumnt réellement – cela finit par déborder du tampon de l’expéditeur ( SO_SNDBUF ) et fait apparaître le processus du serveur “bloqué” dans l’appel système send(2) . À ce stade, le kernel attend que l’autre extrémité reconnaisse certaines des données en attente, mais le destinataire ne l’attend pas, de sorte qu’il ne recv(2) pas recv(2) .

Il y a probablement d’autres explications, mais c’est difficile à dire sans voir le code.

Si send() bloque sur un socket TCP, cela indique que le tampon d’envoi est plein, ce qui indique que l’homologue à l’autre extrémité de la connexion ne lit pas les données assez rapidement. Peut-être que ce client est complètement bloqué et n’appelle pas assez souvent recv() .

Nagle ne causerait pas de “disparition dans le kernel”, c’est pourquoi sa désactivation ne vous aide pas. Nagle se contentera de mettre en mémoire tampon des données pendant un petit moment, mais finira par les envoyer sans aucune invite de l’utilisateur.

Il y a un autre coupable.


Modifier pour la question mise à jour.

Vous devez vous assurer que le client reçoit toutes les données envoyées et qu’il les reçoit rapidement . Demandez à chaque client d’écrire dans un journal ou quelque chose à vérifier.

Par exemple, si un client attend que le serveur accepte sa mise à jour de 23 octets, il risque de ne pas recevoir les données. Cela peut entraîner le remplissage du tampon d’envoi du serveur, ce qui provoquerait une dégradation et un blocage éventuel.

Si c’est effectivement le coupable, la solution serait une communication asynchrone, comme la bibliothèque Asio de Boost.