2013-04-21 2 views
12

Какая разница between-Установка Идеальный размер пула потоков

newSingleThreadExecutor vs newFixedThreadPool(20)

с точки зрения операционной системы и точки зрения программирования.

Всякий раз, когда я запускаю свою программу, используя newSingleThreadExecutor, моя программа работает очень хорошо, а латентность от конца до конца (95-й процентиль) происходит около 5ms.

Но как только я начинаю свою программу работы using-

newFixedThreadPool(20)

моя программа снижает производительность, и я начинаю видеть конец к концу задержки в 37ms.

Итак, теперь я пытаюсь понять с точки зрения архитектуры, что здесь означает количество потоков? И как решить, какое оптимальное количество потоков я должен выбрать?

И если я использую большее количество потоков, то что произойдет?

Если кто-нибудь может объяснить мне эти простые вещи на языке непрофессионала, тогда это будет очень полезно для меня. Спасибо за помощь.

Моя машина конфигурации спектрометре Я бегу свою программу из Linux машинно

processor  : 0 
vendor_id  : GenuineIntel 
cpu family  : 6 
model   : 45 
model name  : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz 
stepping  : 7 
cpu MHz   : 2599.999 
cache size  : 20480 KB 
fpu    : yes 
fpu_exception : yes 
cpuid level  : 13 
wp    : yes 
flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm arat pln pts 
bogomips  : 5199.99 
clflush size : 64 
cache_alignment : 64 
address sizes : 40 bits physical, 48 bits virtual 
power management: 

processor  : 1 
vendor_id  : GenuineIntel 
cpu family  : 6 
model   : 45 
model name  : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz 
stepping  : 7 
cpu MHz   : 2599.999 
cache size  : 20480 KB 
fpu    : yes 
fpu_exception : yes 
cpuid level  : 13 
wp    : yes 
flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm arat pln pts 
bogomips  : 5199.99 
clflush size : 64 
cache_alignment : 64 
address sizes : 40 bits physical, 48 bits virtual 
power management: 
+1

Вы не удовлетворены ответом здесь: http: //stackoverflow.com/questions/16125626/performance-issues-with-newfixedthreadpool-vs-newsinglethreadexecutor? – NINCOMPOOP

+0

Я хотел разобраться более подробно. Этот вопрос, который я опубликовал, больше касался программирования и поиска узкого места, но Грей предположил, что это может быть проблема с размером потоков. Поэтому я подумал, давайте опубликуем еще один вопрос, но на этот раз более конкретный для архитектуры точки зрения. – ferhan

ответ

24

Ok. В идеале, если ваши потоки не имеют блокировки, так что они не блокируют друг друга (независимо друг от друга), и вы можете предположить, что рабочая нагрузка (обработка) одинакова, то получается, что размер пула равен Runtime.getRuntime().availableProcessors() или availableProcessors() + 1 дает наилучшие результаты.

Но скажите, если потоки мешают друг другу или имеют ввод/вывод, то закон Amadhal объясняет довольно хорошо. Из вики,

закона Амдаля утверждает, что если P является долей программы, которая может быть выполнена параллельно (то есть, выгоды от распараллеливания), а (1 - Р) доля, которая не может быть распараллеливаемой (остается последовательными), то максимальное ускорение, которое может быть достигнуто за счет использования процессоров N является

Amadhal law

В вашем случае, в зависимости от числа ядер, доступных, и какие работы они точно делать (чистый расчет? I/«Блокировать блокировку?» Для какого-то ресурса? И т. Д.), Вам нужно придумать решение на основе по вышеуказанным параметрам.

Например: Несколько месяцев назад я занимался сбором данных с цифровых веб-сайтов. Моя машина была 4-ядерная, и у меня был размер пула 4. Но поскольку операция была чисто I/O, и моя чистая скорость была приличной, я понял, что у меня лучшая производительность с размером пула 7. И это потому, что потоки не сражались за вычислительную мощность, а за ввод-вывод. Поэтому я мог бы использовать тот факт, что больше потоков может оспаривать ядро ​​положительно.

PS: Предлагаю, проходя через главу Производительность из книги - Java Concurrency на практике Брайана Гетца. В нем подробно рассматриваются такие вопросы.

+0

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

+0

@TechGeeky, вызывающий 'Runtime.getRuntime(). AvailableProcessors()' вернет вам число ядер – Jatin

+0

Да, похоже, что у меня только 2 ядра в моей машине загрузки и производительности. И я запускал свою программу с 20 потоками, поэтому я вижу в моей программе столько проблем с высокой производительностью. Правильно? – ferhan

4

Итак, теперь я пытаюсь понять с точки зрения архитектуры, что здесь означает количество потоков?

В каждом потоке имеется своя собственная память стека, счетчик программ (как указатель на выполнение следующей команды) и другие локальные ресурсы. Переключение между ними задерживает латентность для одной задачи. Преимущество состоит в том, что, хотя один поток неактивен (обычно при ожидании ввода-вывода), другой поток может получить работу. Кроме того, если доступно несколько процессоров, они могут работать параллельно, если между задачами нет конфликта ресурсов и/или блокировки.

И как решить, какое оптимальное количество потоков я должен выбрать?

Компромисс между своп-ценой по сравнению с возможностью избежать простоев зависит от мелких деталей того, что ваша задача выглядит как (насколько я/о, и когда, с тем, как много работы между I/O , используя объем памяти для завершения). Эксперимент всегда является ключом.

И если я использую большее количество потоков, что произойдет?

Вначале обычно будет линейный рост пропускной способности, затем относительная плоская часть, затем капля (которая может быть довольно крутой). Каждая система отличается.

0

Глядя на закон Амдаля, хорошо, особенно если вы точно знаете, насколько велики P и N. Так как это никогда не произойдет, вы можете контролировать производительность (что вам следует делать в любом случае) и увеличить/уменьшить размер пула потоков, чтобы оптимизировать все показатели производительности для вас.

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