Prise recv appel gèle le fil pendant env. 5 secondes

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