J'ai une application côté serveur ouvre un thread socket pour chaque client connecté. J'ai un DataInputStream dans chaque thread, qui appelle read (byte [] array) pour lire les données. Je définis également le délai d'attente de socket à quelques minutes. Le code principal est quelque chose comme ceci:Java DataInputStream.read() entraînant 20% d'utilisation CPU constante pendant le blocage.
while (dataInputStream.read(array) != -1) { do something... }
Cependant, après plusieurs heures de fonctionnement, en jconsole avec plugin topthreads, je peux voir plusieurs threads clients utilisent CPU ish 20% chacun. Si je clique dessus, la pile d'appels montre que le thread est bloqué sur la ligne ci-dessus, sur la fonction read().
Je sais que la fonction read() bloquera normalement pour attendre les données. Lorsqu'il est bloqué, il consomme peu de cycles CPU. Maintenant, il utilise 20% ish chacun et mon serveur est de plus en plus lent lorsque plus de threads ont le même problème. Mon serveur a environ 5 demandes de connexion par seconde, ce qui arrive très rarement car en quelques heures seulement 5 threads ont le problème.
Je suis vraiment confus. Est-ce que quelqu'un peut m'aider?
en fonction de [link] (http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/) en utilisant un bufferedInputStream a les mêmes performances que l'utilisation de read (byte []). – Lee