У меня есть многопоточное приложение JAVA, работающее на CPU с N ядрами (в Linux), однако оно использует только 0-е ядро, а остальные ядра простаивают - PullRequest
0 голосов
/ 04 сентября 2018

Если я не ошибаюсь, JVM полагается на базовую архитектуру ОС для планирования и распространения потоков на другие ядра (когда поток порождается). Однако в моем приложении я не вижу, чтобы это произошло. Каждый поток работает на 0-м ядре, а остальные ядра N-1 находятся в состоянии ожидания. Есть ли какая-то конкретная причина, по которой это происходит, и, более того, как решить эту проблему, чтобы я мог использовать остальные свои ядра?

Я знаю о настройке сходства процессов, но это, в некотором смысле, жесткое программирование процесса для конкретного ядра. Поскольку поток может быть порожден в любой заданной точке, он должен бездействовать, если ядро ​​бездействует.

Фрагмент кода, например

public static void main() {

R1 r1 = new R1();
R2 r2 = new R2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1.start();
t2.start();
}

Есть предложения?

1 Ответ

0 голосов
/ 04 сентября 2018

В вашем приложении почти наверняка есть что-то, из-за чего JVM не может запускать более одного потока приложения одновременно.

Проблема будет в классах R1 и R2, или в чем-то, от чего они зависят. Поскольку вы решили не показывать их нам, мы можем только догадываться, что это может быть. Однако распространенным объяснением является то, что один из потоков (запускает ваш код) удерживает блокировку, которую пытается получить другой поток. Этого может быть достаточно, чтобы ваше приложение эффективно однопоточное.

Совет:

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

  • Запустите приложение с помощью отладчика и т. Д.

  • Не тратьте свое время на изучение планировщика, схожести потоков и тому подобного. Они вряд ли помогут вам решить проблему.

...