2010-09-30 2 views
1

Я использую TheadPoolExecutor, который выполняется в PriorityQueue. Я установил минимальный размер пула 5 и максимум 50. Когда мы выполнили тест нагрузки, мы увидели, что 10% -ый прыжок - это CPU. Свалка нить показываетПроизводительность процессора с использованием ThreadPoolExecutor

бассейн-1-нить-5" PRIO = 3 TID = 0x020f69a0 NID = 0xa3 ожидание состояния [0xb517f000..0xb517f970] на sun.misc.Unsafe.park (нативный метод) на Java .util.concurrent.locks.LockSupport.park (LockSupport.java:118) at java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await (AbstractQueuedSynchronizer.java:1841) at 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)

Чувствуете ли вы, что preartAllCoreThreads(), которое я использую в ThreadPoolExecutor, будут иметь проблемы с производительностью?

ТИА

+1

Простые потоки ничего не делают, если у вас есть 5 или 5000. Создание потоков имеет накладные расходы и потребляет ресурсы, но как только они создаются, они только теряют память, а не процессор. BTW: Вы уверены, что хотите больше потоков, чем у вас есть ядра? (или у вас есть 50 свободных ядер) –

+0

Имея больше потоков, чем ядра, имеет смысл, если они связаны с IO, однако слишком много потоков могут тратить процессорное время с чрезмерным количеством переключателей контекста. См. Http://blogs.mulesoft.org/chasing-the-bottleneck-true-story-about-fighting-thread-contention-in-your-code/ для очень интересного объяснения. – Pino

ответ

1

sun.misc.Unsafe.park Метод, где нити, которые создаются с помощью ThreadPoolExecutor будет ждать, пока не будут получены новые сообщения. Внутренне ThreadPoolExecutor имеет очередь Runnable s, которая будет обрабатывать ожидающие потоки. Если ваша система не работает или достаточно спокойна, ожидайте увидеть в ней несколько потоков, ожидающих этого метода.

Если вы профилируете систему, этот метод часто возникает как ключевой потребитель времени. Это ожидается, если в большинстве случаев потоки ждут работы.

+0

Профилирование обычно показывает время процессора ... нет? Я имею в виду, я согласен, если вы будете постоянно опробовать текущий стек Thread, большая часть реального времени жизни, скорее всего, будет потрачена на ожидание новых задач в большинстве систем. –

+0

Если некоторые потоки проводят большую часть времени (скажем, 80%) в парке, означает ли это (кроме переключения контекста), что время «не используется» и не является частью того, что замедляет приложение? –

Смежные вопросы