2010-09-30 6 views
1

J'utilise TheadPoolExecutor qui s'exécute sur une PriorityQueue. J'ai mis une taille de pool minimum de 5 et maximum de 50. Lorsque nous avons exécuté le test de charge, nous avons vu comme 10% de saut est CPU. La décharge du fil montrePerformance du processeur avec ThreadPoolExecutor

pool-1-fil-5" prio = 3 tid = 0x020f69a0 nid = 0xA3 attente à la condition [0xb517f000..0xb517f970] à sun.misc.Unsafe.park (Méthode natif) à java .util.concurrent.locks.LockSupport.park (LockSupport.java:118) à java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await (AbstractQueuedSynchronizer.java:1841) à java.util.concurrent.PriorityBlockingQueue.take (PriorityBlockingQueue.java:200) à java.util.concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:470) à java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:675) à java.lang .Thread.run (Thread.java:595)

Vous vous demandez si le composant prestartAllCoreThreads() que j'utilise dans ThreadPoolExecutor rencontre des problèmes de performances?

TIA

+1

Les threads inactifs ne font rien, que vous ayez 5 ou 5000. Créer des threads a une surcharge et consomme des ressources, mais une fois qu'ils sont créés, ils ne gaspillent que de la mémoire et non du CPU. BTW: Êtes-vous sûr que vous voulez plus de threads que vous avez des cœurs? (ou avez-vous 50 cœurs libres) –

+0

Avoir plus de threads que de cœurs est logique s'ils sont liés à l'E/S, mais avoir trop de threads peut faire perdre du temps CPU avec un nombre excessif de changements de contexte. Voir http://blogs.mulesoft.org/chasing-the-bottleneck-true-story-about-fighting-thread-contention-in-your-code/ pour une explication très intéressante. – Pino

Répondre

1

La méthode sun.misc.Unsafe.park est l'endroit où les fils qui sont créés par le ThreadPoolExecutor attendront jusqu'à ce que de nouveaux messages sont reçus. En interne, le ThreadPoolExecutor dispose d'une file d'attente de Runnable s qu'il fermera aux threads en attente. Si votre système est inactif ou raisonnablement silencieux, attendez-vous à voir un certain nombre de threads en attente dans cette méthode.

Si vous profilez un système, cette méthode apparaîtra souvent comme un consommateur clé de temps. Ceci est attendu si la plupart du temps les threads attendent du travail à faire.

+0

Le profilage montre généralement le temps CPU ... non? Je veux dire, je suis d'accord, si vous deviez continuellement interroger la pile actuelle du Thread, la plus grande partie de la vie réelle est probablement passée en attente de nouvelles tâches dans la plupart des systèmes. –

+0

Si certains threads passent le plus clair de leur temps (disons 80%) dans park, cela signifie-t-il (autre que le changement de contexte) que ce temps n'est pas utilisé et ne fait pas partie de ralentir l'application? –

Questions connexes