Dans notre projet de jeu en ligne basé sur C/S, nous utilisons TCP pour la transmission réseau. Nous incluons Libevent, utilisons un bufferevent pour chaque connexion à gérer avec les E/S réseau automatiquement.Latence extrêmement élevée lorsque le réseau est occupé, TCP, libevent
Cela fonctionne bien avant, mais le problème de retard vient à la surface récemment. Lorsque je fais un test de stress pour rendre le réseau plus actif, la latence devient extrêmement élevée, plusieurs secondes ou plus. Le serveur s'enfonce dans un état confus:
- l'utilisation moyenne du processeur a diminué (0% -60% -0% de répétition -60%, quelque chose d'attente?)
- le trafic net a diminué (nethogs)
- les clients connectés au serveur encore en vie (netstat & tcpdump)
Il ressemble à quelque chose ralenties par magie tout système vers le bas, mais une nouvelle connexion au serveur a répondu à arrêter dans le temps.
Lorsque j'ai changé le protocole en UDP, cela fonctionne bien sur la même situation: pas de latence apparente, le système s'exécute rapidement. Le trafic net est d'environ 3M/S.
Le projet s'exécute sur un intranet. J'ai également testé la vitesse de téléchargement max, près de 18M/S.
J'ai étudié une partie des fichiers d'en-tête et des instructions de Libevent, j'ai essayé de configurer une limite de débit pour toutes les connexions. Il a fait quelques améliorations, mais pas complètement résolu le problème même si j'avais essayé plusieurs configurations différentes. Voici mes paramètres: read_rate 163840, read_burst 163840, write_rate 163840, write_burst 163840, tick_len 500ms.
Nous vous remercions de votre aide!
Je suis vraiment reconnaissant pour votre aide, merci beaucoup! J'ai suivi votre conseil pour obtenir une capture réseau via wireshark. J'ai obtenu un total de 312788 images pendant 180 secondes, y compris: 37 ACK Dupliquer du client au serveur, 27 retransmissions du serveur au client. Le graphique IO est également très incohérent, principalement 94KB/S, et soudainement monter à 4040 ~ 5586 KB/S dans un intervalle de temps régulier. L'intervalle de temps moyen est d'environ 7 secondes et l'intervalle devient plus long et plus long au fil du temps, en d'autres termes, le graphique IO devient de plus en plus incohérent. – walter
@walter De rien. Si vous pouvez mettre la capture quelque part je peux l'obtenir, je serais heureux de jeter un coup d'oeil. Être capable de comprendre ce qui se passe à partir d'une capture de réseau est une vraie compétence, un peu comme si l'on utilisait un débogueur. Mais il peut être une compétence très utile d'investir. –
Puis-je avoir votre adresse e-mail s'il vous plaît? C'est un peu difficile pour moi de télécharger le fichier vers un service cloud que vous pouvez obtenir facilement. La vitesse ici pour naviguer sur un site Web étranger est très lente. – walter