Affiniteit met Java-threads

Weet iemand een manier om individuele threads binnen een Java-proces te vergrendelen voor specifieke CPU-kernen (onder Linux)? Ik heb dit in C gedaan, maar kan niet vinden hoe ik dit in Java moet doen. Mijn instinct is dat hiervoor een JNI-oproep nodig is, maar ik hoopte dat iemand hier misschien enig inzicht heeft of het misschien eerder heeft gedaan.

Bedankt!


Antwoord 1, autoriteit 100%

Je kunt dit niet in pure Java doen. Maar als je het echt nodig hebt, kun je JNI gebruiken om native code aan te roepen die het werk doet. Dit is de plek om mee te beginnen:

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:Na enig nadenken heb ik besloten hier mijn eigen klas voor te maken: ThreadAffinity.javaHet is JNA-gebaseerd en heel eenvoudig — dus als je het wilt gebruiken in productie, misschien zou je wat tijd moeten besteden aan het stabieler maken, maar voor benchmarking en testen werkt het goed zoals het is.

UPD 2:Er is nog een bibliotheekvoor werken met threadaffiniteit in java. Het gebruikt dezelfde methode als eerder vermeld, maar heeft een andere interface


Antwoord 2, autoriteit 19%

Ik weet dat het een tijdje geleden is, maar als iemand deze thread tegenkomt, hier is hoe ik dit probleem heb opgelost. Ik schreef een script dat het volgende zou doen:

  1. “jstack -l “
  2. Neem de resultaten, zoek de “nid”‘s van de threads die ik handmatig wil vergrendelen tot cores.
  3. Geef die threads een taak.

Antwoord 3, autoriteit 6%

Misschien wil je een kijkje nemen op https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/test/java/com/higherfrequencytrading/affinity/AffinityLockBindMain.java


Antwoord 4

IMO, dit is niet mogelijktenzij je native calls gebruikt. JVM wordt verondersteld platformonafhankelijk te zijn, alle systeemaanroepen die worden gedaan om dit te bereiken, resulteren niet in een draagbare code.

Other episodes