Настройка Java для использования одного процессора - PullRequest
8 голосов
/ 27 мая 2009

У меня есть приложение, которое имеет лицензию на установленное количество процессоров, и я хочу иметь возможность установить количество процессоров, в которых работает java, до 1, прежде чем проверка будет завершена. Я использую Solaris и посмотрел на pbind, но подумал, что если бы я запустил приложение и затем использовал pbind, он проверил бы лицензию, прежде чем установил количество процессоров, которые мог бы использовать java.

Кто-нибудь знает способ запуска приложения с установленным количеством процессоров в Solaris?

Ответы [ 4 ]

3 голосов
/ 27 мая 2009

Это обходной путь, но с помощью Solaris 10 вы можете настроить зону с одним доступным процессором, а затем запустить приложение внутри этой зоны.

Если вы хотите выполнить тестирование без запуска полного приложения, этот бит Java, скорее всего, используется для получения количества процессоров:

Runtime runtime = Runtime.getRuntime();
int nrOfProcessors = runtime.availableProcessors();

Полный пример здесь .

1 голос
/ 27 мая 2009

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

% pbind -b 0 $$
% java ...
1 голос
/ 27 мая 2009

Это не полное решение, но может быть достаточно, чтобы превратиться в одно. Определенно существует точка, в которой существует процесс java (и, следовательно, может управляться pbind), и в этот момент он еще не запустил код для проверки процессора. Если вы можете приостановить запуск самого приложения до тех пор, пока pbind не выполнит свою работу, это должно быть в порядке (при условии, что идея pbind будет работать с точки зрения проверки ЦП).

Один из способов сделать это, который определенно должен остановить JVM в соответствующем месте, - это подключение к сокету для удаленных отладчиков и запуск в режиме ожидания. Если в вызов java переданы следующие аргументы:

-Xdebug -Xrunjdwp: transport = dt_socket, address = 8000, suspend = y, server = y

затем JVM приостановит работу после запуска процесса java, но перед выполнением основного класса, пока отладчик / агент не будет подключен к порту 8000.

Так что, возможно, можно было бы использовать скрипт-обертку для запуска программы в фоновом режиме с этими параметрами, поспать секунду или около того, использовать pbind, чтобы установить число процессоров равным одному для процесса java, затем присоединить и Отключите некоторый агент к порту 8000 (этого будет достаточно, чтобы Java продолжил выполнение).

Недостатки или потенциальные икоты в этой идее заключались бы в том, будет ли работа в режиме отладки заметно влиять на производительность вашего приложения (в общем, это не оказывает большого влияния), можете ли вы контролировать какую-то неактивную JDWP агент из командной строки, и можете ли вы открыть порты на машине. Это не то, что я пытался автоматизировать ранее (хотя я использовал что-то похожее вручную, чтобы увеличить nice нативность Java-процесса перед тем, как выпустить его), поэтому могут быть и другие проблемы, которые я упустил из виду. .

0 голосов
/ 27 мая 2009

Погуглив, я обнаружил, что вы правы, pbind привязывает процессы к процессорам.

Больше информации и примеров на: http://docs.sun.com/app/docs/doc/816-5166/pbind-1m?a=view

...