2010-05-18 4 views
5

J'écris une application Java qui s'exécute dans Tomcat, sur un matériel multi-core. L'application exécute un algorithme et renvoie la réponse à l'utilisateur. Le problème est que même lorsque j'exécute deux requêtes simultanément, le processus tomcat utilise au plus un cœur de CPU.
Pour autant que je sache, chaque requête dans Tomcat est exécutée dans un thread distinct, et JVM doit exécuter chaque thread sur un noyau de processeur distinct.Tomcat multithread problème

Quel pourrait être le problème qui limite la JVM ou Tomcat à utiliser pas plus d'un noyau?

Merci d'avance.

+0

Quelle JVM utilisez-vous? – ShiDoiSi

+0

La version java est "1.6.0_20" – jutky

Répondre

0

Vous pouvez simplement imprimer le nom du fil comme un test rapide. Que se passe-t-il si vous exécutez l'algorithme dans une application autonome?

+0

Après beaucoup de tests, j'ai trouvé que dans l'application autonome, le même problème existe toujours. J'ai continué avec le profilage détaillé et j'ai pris la décision que lorsque le FULL GC est en cours d'exécution, tous les autres threads sont en veille et je vois qu'un seul cœur de CPU est en cours d'utilisation. Le problème est que l'algorithme est gourmand en mémoire et presque tout le temps JVM essaie d'exécuter FULL GC. Donc, il n'y a pas de problème dans Tomcat, je vais maintenant passer en revue l'utilisation de la mémoire, et essayer de trouver où je peux économiser les déchets de mémoire. Je marque cette réponse comme correcte car elle me conduit à la conclusion correcte (malgré le fait que ce n'est pas vraiment résoudre le problème). – jutky

0

Toute la gestion du processeur sera prise en charge par le serveur lui-même. Il n'est pas obligatoire que si vous passez deux demandes, il doit utiliser deux processeurs. Etes-vous sûr que deux threads sont en cours de création?

+0

Alors, comment puis-je la gérer pour faire tourner des processeurs différents? – jutky

+0

L'allocation des ressources n'est pas entre nos mains. Mais l'administrateur du serveur peut configurer l'équilibrage de charge entre deux serveurs en fonction de certaines conditions comme l'utilisation de la mémoire, l'utilisation du processeur, etc., –

+2

Je cours le tomcat par le mien, donc il devrait être entre mes mains. – jutky

0

Exécutez-vous des blocs/méthodes synchronisés qui forceraient l'exécution en série? La configuration du connecteur tomcat dans server.xml contrôle le pool de threads de la requête, mais la valeur par défaut est 200 threads, IIRC.

+0

J'ai des blocs synchronisés, mais pour autant que j'ai vérifié, ils ne causent pas le problème. J'essaye de le revérifier encore une fois. – jutky

-1

Voici la procédure pour faire un équilibrage de charge dans tomcat http://tomcat.apache.org/tomcat-5.5-doc/balancer-howto.html

Je pense que cela va fonctionner avec Tomcat 6 aussi, comme ils ont mentionné équilibreur webapp est livré avec tomcat 5.0 et versions ultérieures.

+0

ne parlaient pas de demandes d'équilibrage de charge à plusieurs serveurs parlaient de demandes multi-thread. – user3338098