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


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

спасибо!

5 57

5 ответов:

вы не можете сделать это в чистом 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. Он использует тот же метод, что и ранее, но имеет другой интерфейс

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

  1. "jstack-l"
  2. возьмите результаты, найдите"nid" из потоков, которые я хочу вручную заблокировать до ядер.
  3. Taskset эти потоки.

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

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

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

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