Affinità del thread Java

Qualcuno sa di un modo per bloccare singoli thread all’interno di un processo Java su core CPU specifici (su Linux)? L’ho fatto in C, ma non riesco a trovare come farlo in Java. Il mio istinto è che questo richiederà una chiamata JNI, ma speravo che qualcuno qui potesse avere qualche intuizione o avrebbe potuto farlo prima.

Grazie!

Non puoi farlo in puro java. Ma se proprio ne hai bisogno, puoi usare JNI per chiamare il codice nativo che fa il lavoro. Questo è il posto da cui iniziare:

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: Dopo un po ‘di riflessione, ho deciso di creare la mia class per questo: ThreadAffinity.java È basato su JNA e molto semplice – quindi, se vuoi usarlo in produzione, potresti dover passare un po’ di tempo a fare è più stabile, ma per il benchmarking e il test funziona bene così com’è.

UPD 2: esiste un’altra libreria per lavorare con affinità di thread in java. Usa lo stesso metodo di prima, ma ha un’altra interfaccia

So che è passato un po ‘di tempo, ma se qualcuno si imbatte in questo thread, ecco come ho risolto questo problema. Ho scritto uno script che avrebbe fatto quanto segue:

  1. “jstack -l”
  2. Prendi i risultati, trova i “nid” dei thread che voglio bloccare manualmente sui core.
  3. Taskset quei thread.

IMO, questo non sarà ansible a meno che non si utilizzino chiamate native. JVM dovrebbe essere indipendente dalla piattaforma, qualsiasi chiamata di sistema fatta per raggiungere questo risultato non produrrà un codice portatile.

Non è ansible (almeno con Java normale).

È ansible utilizzare i pool di thread per limitare la quantità di thread (e quindi di core) utilizzati per diversi tipi di lavoro, ma non è ansible specificare un core da utilizzare.

Esiste anche la (piccola) possibilità che il tuo runtime Java non supporti il ​​threading nativo per il tuo sistema operativo o hardware. In questo caso, vengono utilizzati i thread verdi e verrà utilizzato solo un core per l’intera JVM.