2010-12-14 90 views
2

Pour être plus précis, j'ai écrit un serveur avec Java NIO, et il fonctionne bien, après quelques tests, j'ai découvert que pour une raison quelconque, un appel à la méthode d'écriture SocketChannels prend en moyenne 1 ms, la méthode read l'autre main prend 0.22ms en moyenne. Au début, je pensais que régler les valeurs de tampon d'envoi/réception sur Socket pourrait aider un peu, mais après y avoir réfléchi, tous les messages sont très courts (quelques octets) et j'envoie un message à peu près tous les 2. secondes sur une seule connexion. Les tampons envoyés et reçus ont une taille bien supérieure à 1024 octets, donc ce n'est pas vraiment le problème, j'ai plusieurs milliers de clients connectés à la fois.Java mise en réseau, les appels à écrire en moyenne prendre 4x plus long que les appels à lire, est-ce normal?

Maintenant, je suis un peu hors des idées sur ce sujet, est-ce normal et si c'est le cas, pourquoi?

+0

Étant donné que vous utilisez NIO, je suppose que vous utilisez un sélecteur et n'écrivez que lorsque la clé est prête pour l'écriture ou utilisez-vous des appels bloquants? Voulez-vous nous obtenir un échantillon du code? – Nuoji

Répondre

0

Je commencerais par utiliser Wireshark pour éliminer les variables.

+0

Il utilise déjà NIO. L'écriture doit donc simplement copier les données dans un tampon et laisser la pile TCP/IP gérer tout le reste. – Darron

+0

Noté, idiotie enlevée, merci. –

0

@Nuoji J'utilise nonblocikng-io et oui je me sers d'un sélecteur, comme pour quand j'écris un canal i effectuer les opérations suivantes:

Depuis que je l'ai écrit au deuxième alinéa dans mon post est vrai , je suppose que le canal est prêt pour l'écriture dans la plupart des cas, donc je ne fixe pas d'abord l'intérêt sur la touche pour écrire, mais j'essaie plutôt d'écrire directement sur le canal. Dans le cas où, je ne peux pas tout écrire sur le canal (ou quoi que ce soit d'autre), je définis l'intérêt sur la touche pour écrire (de cette façon la prochaine fois que j'essaye d'écrire sur le canal, il est prêt écrire). Bien que dans mes tests où j'ai obtenu les résultats mentionnés dans le message original, cela arrive très rarement.

Et oui, je peux vous donner des échantillons du code, même si je n'ai pas vraiment envie de déranger personne avec elle. Quelles parties en particulier aimeriez-vous voir, le fil du sélecteur ou le fil d'écriture?