Възможно ли е да принудите съществуващо Java приложение да използва не повече от x ядра?

Ние правим сравнителен анализ на съществуващи Java програми. Те са нишкови приложения, предназначени да се възползват от многоядрените процесори. Бихме искали да измерим ефекта от броя на ядрата върху скоростта на работа, но не желаем (и не можем) да променим кода на тези приложения.

Разбира се, бихме могли да тестваме софтуера на различни машини, но това е скъпо и сложно. Предпочитаме софтуерно решение.

Забележка: можете да приемете, че платформата за тестване е Windows, Linux или Mac. В идеалния случай бихме искали да можем да изпълняваме тестовете на всяка от тези платформи.


person Daniel Lemire    schedule 16.01.2012    source източник
comment
Не мисля, че се контролира в java програми, предполагам, че е чисто специфично за OS решение. Любопитен съм да видя мнението на експерти по този въпрос.   -  person kosa    schedule 16.01.2012
comment
Ако имате нужда от персонализирано софтуерно решение/персонализиране, което най-вероятно ще бъде много по-скъпо от самия хардуер. И аз не съм сигурен дали можете да принудите Java програма да използва само едно ядро ​​във всеки един момент. неща, свързани с OS/JVM   -  person fmucar    schedule 16.01.2012
comment
Помислете за стартиране във виртуална машина като VirtualBox. След това имате прост GUI за определяне на мощността на процесора, налична за екземпляра.   -  person Thorbjørn Ravn Andersen    schedule 13.04.2013


Отговори (2)


Нарича се настройка на афинитета на процесора и е настройка на ОС за процеси, а не специфична за Java.

Под Linux: http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html

В Windows: http://www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an-application-in-windows/

На Mac не изглежда, че можете да го настроите: https://superuser.com/questions/149312/how-to-set-processor-affinity-on-os-x

person Chris Shain    schedule 16.01.2012
comment
Също така вижте github.com/peter-lawrey/Java-Thread-Affinity за java библиотека, която може да ви помогне с вашите тестове. - person philwb; 17.01.2012
comment
Освен това (въпреки че това може да зависи от внедряването), ако зададете афинитета на процесора преди да извикате Runtime.getRuntime().availableProcessors(), този метод ще отрази промяната и ще върне (намаления) брой налични ядра > за JVM -- в точно съответствие с нейните javadoc. - person Bass; 23.10.2015

Обърнете проблема с главата надолу; вместо да измисляте как да ограничите приложението да използва само n ядра на машина с m ядро, измислете как да се уверите, че има само n > налични за вашето приложение ядра. Можете да напишете много проста програма, която изяжда едно ядро, като направите нещо като while (true); и стартирате m-n екземпляри на тази програма, работещи с най-висок приоритет, като по този начин гарантирате, че вашият кодът има само n налични ядра.

Като алтернатива, ако вашият BIOS или операционна система позволява деактивиране на процесорните ядра, това също работи. Знам, че инструментите CHUD на Mac OS X го правеха, но не съм докосвал тези инструменти от ерата на G5, така че може вече да не работи.

person jeanfrancoisim    schedule 16.01.2012