Nice programing

자바 스레드 선호도

nicepro 2020. 12. 5. 10:41
반응형

자바 스레드 선호도


Java 프로세스 내의 개별 스레드를 특정 CPU 코어 (Linux)로 잠그는 방법을 아는 사람이 있습니까? C에서이 작업을 수행했지만 Java에서 수행하는 방법을 찾을 수 없습니다. 내 본능은 JNI 호출이 필요하지만 여기 누군가가 통찰력을 갖거나 전에 해본 적이 있기를 바랐습니다.

감사!


순수 자바에서는 이것을 할 수 없습니다. 하지만 정말 필요한 경우 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 : 자바에서 스레드 선호도와 작업하기위한 또 다른 라이브러리 가 있습니다 . 이전에 언급 한 것과 동일한 방법을 사용하지만 다른 인터페이스가 있습니다.


나는 그것이 오래되었다는 것을 알고 있지만 누군가이 스레드를 발견하면이 문제를 해결하는 방법은 다음과 같습니다. 다음을 수행하는 스크립트를 작성했습니다.

  1. "jstack -l"
  2. 결과를 가져 와서 수동으로 코어에 잠 그려는 스레드의 "nid"를 찾으십시오.
  3. 그 스레드를 Taskset합니다.

https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/test/java/com/higherfrequencytrading/affinity/AffinityLockBindMain.java를 살펴볼 수 있습니다.


IMO,이 되지 않습니다 네이티브 호출을 사용하지 않는 한 가능하다. JVM은 플랫폼 독립적이어야하며이를 달성하기 위해 수행 된 모든 시스템 호출은 이식 가능한 코드를 생성하지 않습니다.


불가능합니다 (적어도 일반 Java에서는).

스레드 풀 을 사용하여 다양한 유형의 작업에 사용되는 스레드 (및 코어)의 양을 제한 할 수 있지만 사용할 코어를 지정할 수있는 방법은 없습니다.

Java 런타임이 OS 또는 하드웨어에 대한 기본 스레딩을 지원하지 않을 가능성도 있습니다. 이 경우 녹색 스레드 가 사용되며 전체 JVM에 대해 하나의 코어 만 사용됩니다.

참고 URL : https://stackoverflow.com/questions/2238272/java-thread-affinity

반응형