J’ai une architecture de serveur client implémentée en C ++ avec des sockets de blocage sous Windows 7. Tout fonctionne bien jusqu’à un certain niveau de charge. Si quelques clients (par exemple> 4) reçoivent ou envoient des mégaoctets de données, la communication avec un client est parfois bloquée pendant environ 5 secondes. Tous les autres clients fonctionnent comme prévu dans ce cas.
La taille de la mémoire tampon est de 8 192 octets et la journalisation côté serveur se présente comme suit:
TimeStamp (s.ms) – octets reçus
…
1299514524.618 – 8192
1299514524.618 – 8192
1299514524.618 – 0004
1299514529.641 – 8192
1299514529.641 – 3744
1299514529.641 – 1460
1299514529.641 – 1460
1299514529.641 – 8192
…
Il semble que seuls 4 octets puissent être lus dans les 5 secondes. De plus, j’ai découvert que le temps de congélation était toujours autour de 5 secondes – jamais 4 ou moins et jamais 6 ou plus …
Des idées?
Meilleures salutations
Michael
Ceci est un bug Windows.
KB 2020447 – La communication par socket utilisant l’adresse de bouclage rencontrera par intermittence un délai de cinq secondes
Un correctif est disponible dans
KB 2861819 – Le transfert de données s’arrête pendant cinq secondes dans une application Windows Socket sous Windows 7 et Windows Server 2008 R2
J’ai eu ce problème dans des situations de forte charge: le dernier paquet de données TCP parfois atteint avant la fin, la stack par défaut n’étant pas définie pour le sorting des paquets, ce désordre a provoqué un résultat similaire à ce que vous décrivez.
La solution adoptée était la suivante: répartition de la charge sur plusieurs serveurs