Сходство потоков Java - PullRequest
       21

Сходство потоков Java

57 голосов
/ 10 февраля 2010

Кто-нибудь знает способ заблокировать отдельные потоки в процессе Java для конкретных ядер процессора (в Linux)? Я сделал это в C, но не могу найти, как это сделать в Java. Мои инстинкты заключаются в том, что для этого потребуется вызов JNI, но я надеялся, что кто-то здесь может иметь некоторое представление или мог сделать это раньше.

Спасибо!

Ответы [ 5 ]

43 голосов
/ 01 августа 2011

Вы не можете сделать это на чистой Java. Но если вам это действительно нужно - вы можете использовать JNI для вызова нативного кода, который выполняет эту работу. Это место для начала:

http://ovatman.blogspot.com/2010/02/using-java-jni-to-set-thread-affinity.html

http://blog.toadhead.net/index.php/2011/01/22/cputhread-affinity-in-java/

UPD: Подумав, я решил создать свой собственный класс для этого: ThreadAffinity.java Он основан на JNA и очень прост - так что если вы Если вы хотите использовать его в производственной среде, возможно, вам следует потратить некоторое время на то, чтобы сделать его более стабильным, но для тестирования и тестирования он работает как есть.

UPD 2: Существует еще одна библиотека для работы со сходством потоков в Java. Он использует тот же метод, что и ранее, но имеет другой интерфейс

9 голосов
/ 22 апреля 2011

Я знаю, что это было давно, но если кто-нибудь сталкивался с этой темой, вот как я решил эту проблему Я написал скрипт, который будет делать следующее:

  1. "jstack -l"
  2. Возьмите результаты, найдите "nid" потоков, которые я хочу вручную привязать к ядрам.
  3. Taskset этих тем.
3 голосов
/ 01 февраля 2012
0 голосов
/ 10 февраля 2010

Это невозможно (по крайней мере, для простой Java).

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

Существует даже (небольшая) вероятность того, что ваша среда выполнения Java не поддерживает собственные потоки для вашей ОС или оборудования. В этом случае используются зеленые нити , и для всей JVM будет использоваться только одно ядро.

0 голосов
/ 10 февраля 2010

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

...