Mon programme C# reçoit beaucoup de données via plusieurs sockets et il semble que j'ai des problèmes de surcharge du cache TCP sur le noyau Windows.
Cela peut être vu par les résultats suivants du tcpdump du serveur:
Mise en cache d'un flux réseau
18: 02: 18,963370 IP xxxx> yyyy.zzz:. ack 10017011 win 0
Quelle structure de données/stratégie utiliseriez-vous pour mettre en cache les données lues afin d'éviter la surcharge sur C#?
Je travaille actuellement avec un délégué pour chaque socket dans un thread séparé qui est appelé après chaque enregistrement lu, mais cela semble être un problème, de sorte que je pourrais avoir besoin de le diviser en deux threads.
Ou devrais-je envisager de peaufiner les paramètres TCP du côté Windows? J'utilise Windows 7.
Y at-il des livres pour l'optimisation du noyau?
J'ai été vraiment aveuglé que le programme est devenu plus lent même si la charge est d'environ 20-25% pour la machine complète et 50-60% sur le noyau le plus chargé.
Très similaire à http://stackoverflow.com/questions/5234277/c-1-socket-client-continous-data/5234427. Je recommanderais la même chose dans votre cas. –
Oui - en effet. Je suis toujours étonné qu'à côté de tcpdump sur la contrepartie, il n'y a pas de véritables indicateurs d'une pile TCP surchargée. C'est apparemment le goulot d'étranglement, même si l'application elle-même semble en bonne santé en regardant les moniteurs de performance dans Windows. – weismat