2009-05-27 4 views
8

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

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

ответ

-1

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

Более подробная информация и примеры по адресу: http://docs.sun.com/app/docs/doc/816-5166/pbind-1m?a=view

+0

Да, спасибо, но неудобно, что на самом деле не отвечает на мой вопрос. –

3

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

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

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

Полный пример here.

+0

Мне было бы интересно узнать, влияет ли использование pbind на результат доступныхпроцессоров(). –

+0

Он должен делать, taskset изменяет результаты доступныхпроцессоров(). –

1

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

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

-Xdebug -Xrunjdwp: транспортное = транспорт по сокетам, адрес = 8000, подвесьте = у, сервер = у

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

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

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

1

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

% pbind -b 0 $$ 
% java ... 
Смежные вопросы