2014-01-22 7 views
6

У меня проблема с моей JVM, запущенной на CentOS 6.0 с openJDK 1.7.0_51 64Bit. Моя система представляет собой 4-ядерную систему с 8 ГБ рамом.Java Многопоточное приложение использует только один Core

Я использую многопоточное приложение Java, которое я написал сам. Он должен вставить тонны данных в базу данных NoSQL. Для этого я создаю 4 потока, используя «CachedThreadPoolExecutor» из java.concurrent.Executors.

Я создаю экземпляр 4 рабочих, которые реализуют интерфейс «Runnable». После этого я запускаю Thread, используя threadpool. Вот мой код:

public void startDataPump(int numberOfWorkers){ 
    //class "DataPump" implements runnable 
    for (int i = 0; i < numberOfWorkers; i++){ 
     DataPump pump = new DataPump(); 
     //"workerList" contains all workers and is a simple arrayList to keep track of the workers 
     workerList.add(pump); 
     //"workers" is the thradpool that has been 
     //initialized earlier with "Executors.newCachedThreadPool() 
     workers.execute(pump); 
    } 
} 

При запуске этого параметра, используя параметр 4, он будет порождать 4 нити в пуле Threadpool. Я предположил, что JVM или моя ОС будут достаточно умны, чтобы планировать эти потоки во всех моих ядрах. ОДНАКО, только одно ядро ​​моего процессора работает на 100%, остальные остаются почти бездействующими.

Я делаю что-то не так в своем коде или это проблема с JVM/OS. Если да, могу ли я что-нибудь с этим сделать? Запуск этого приложения только на 1 ядре крайне замедляет работу всего приложения.

Помощь очень ценится :)

+0

Что делает/proc/cpuinfo показать на ОС? –

+0

вы также можете попробовать nproc или lscpu, чтобы получить основную информацию с компьютера –

+0

, если проблема связана с привязкой к процессору - вы можете установить schedutils (если еще не там): yum install schedutils –

ответ

4

Пожалуйста, имейте в виду, что его ОС, а не JVM отвечает за сродства CPU - именно поэтому я предположил, что вы сначала выяснить, сколько процессоров у вас есть, а затем, возможно, использовать schedulils, чтобы настроить сродство процессора к определенному процессу.

процессор информация - использовать один из трех ниже

/proc/cpuinfo 
lscpu 
nproc 

установить schedutils в confgure процессор Affinity

yum install schedutils 

Вы можете назначить загрузку процессора сродства через schedutils следующим образом (2 является вторым proceccor и 23564 - это идентификатор процесса):

taskset -c 2 -p 23564 
+0

Привет, спасибо за ваш быстрый ответ. lscpu показывает, что есть 4 процессора с 1 Core каждый. Я предполагаю, что это вызывает проблему, поскольку процесс не может быть разделен между процессорами. Это то, что вы получаете при использовании облачной системы! Благодарим за помощь! – hoffmax91

+1

jvm не контролирует близость процессора - его ОС. Возможно, вы сможете изменить это на облачной виртуальной машине с помощью schedutils, хотя я не совсем уверен - Viel Glück !. –

+0

Хорошо, я установил близость процессора ко всем 4 CPU (0-3), однако он все еще работает только на одном CPU. Может ли это быть проблемой Java Runtime, которую я использую? Было бы лучше использовать версию java для оракула? – hoffmax91

1

Планирование потока - это не активность JVM, но это OS activity.if. OS обнаруживает, что потоки независимы друг от друга и могут выполняться отдельно, а затем он планирует его на другом ядре.

Я не уверен schedutils, но я думаю, что это работает на уровне приложений (это позволяет установить загрузку процессора сродства, но последнее решение принимается ОС)

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

Попробуйте создать новый процесс для каждого потока, который поможет улучшить использование процессора (использование большего количества ядер), но есть и недостаток. Каждый процесс создает свою собственную область процесса, поэтому для каждого процесса требуется дополнительная память (для каждого потока в вашем случае), если у вас есть goo d объем доступной памяти, тогда вы можете попробовать это.

Если это просто ОС Linux, то команда «sar» достаточно для мониторинга на использование ядра процессора (sar - это базовый пакет в Linux, почти все утилиты используют «sar», поэтому накладные расходы на систему будут меньше).

+0

Спасибо за сообщение. Я обязательно попробую это. Я просто очень удивлен, потому что на моей системе разработки (машина Windows7) планирование отлично работает, и потоки распределяются поровну между ядрами. На этом CentOS он просто не работает. – hoffmax91

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