2009-05-27 14 views
8

Mam aplikację, która ma licencję na określoną liczbę cpus i chcę mieć możliwość ustawienia liczby cpusów, na które java uruchamia się na 1 przed wykonaniem sprawdzenia. Używam systemu Solaris i przyjrzałem się pbind, ale pomyślałem, że jeśli uruchomię aplikację, a następnie użyję pbind, sprawdziłbym licencję, zanim ustawi ona liczbę procesorów, z których może korzystać java.Ustawienie java do korzystania z jednego procesora

Czy ktoś wie, jak uruchomić aplikację z określoną liczbą procesorów w systemie Solaris?

Odpowiedz

3

Jest to obejście problemu, ale przy użyciu systemu Solaris 10 można skonfigurować strefę o jednym dostępnym procesorem a następnie uruchomić aplikację wewnątrz tej strefy.

Jeśli chcesz zrobić testy bez uruchamiania pełnego stosowania, to trochę Java jest najprawdopodobniej to, czego używasz, aby uzyskać liczbę procesorów:

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

pełny przykład here.

+0

Byłbym bardzo zainteresowany, aby wiedzieć, czy użycie pbind zmienia wynik dostępnych procesorów(). –

+0

To powinno zrobić, zestaw zadań zmienia wyniki dostępnych procesorów(). –

1

To nie jest kompletne rozwiązanie, ale może wystarczyć do jego rozwinięcia. Z pewnością istnieje punkt, w którym istnieje proces java (i tym samym można go kontrolować za pomocą pbind) iw którym momencie jeszcze nie uruchomiono kodu, aby wykonać sprawdzenie procesora. Jeśli możesz wstrzymać uruchomienie samej aplikacji, dopóki pbind nie wykona swojej pracy, powinno to być OK (zakładając, że pomysł pbind będzie działał z punktu widzenia sprawdzania CPU).

Jednym ze sposobów na to, aby zdecydowanie zatrzymać maszynę JVM w odpowiednim miejscu, jest podłączenie do gniazda zdalnego debuggera i rozpoczęcie od trybu zawieszenia. Jeśli przechodzą następujące argumenty do java inwokacji:

-Xdebug -Xrunjdwp: transport = dt_socket, adres = 8000, zawiesić = y, server = y

następnie JVM zostanie wstrzymane po rozpoczęciu proces java, ale przed wykonaniem głównej klasy, aż do przyłączenia debuggera/agenta do portu 8000.

Być może więc możliwe byłoby użycie skryptu otoki, aby uruchomić program w tle z tymi parametrami, uśpić drugi lub mniej, użyj pbind, aby ustawić liczbę procesorów na jeden dla procesu java, a następnie a ttach i odłączyć jakiegoś agenta do portu 8000 (co wystarczy, aby Java mogła kontynuować wykonywanie).

Wadami lub potencjalnymi problemami związanymi z tym pomysłem może być to, czy uruchamianie w trybie debugowania wpłynie znacząco na wydajność aplikacji (ogólnie nie ma to większego wpływu), niezależnie od tego, czy można kontrolować coś w rodzaju "no-op" Agent JDWP z wiersza poleceń i czy możesz otwierać porty na komputerze. To nie jest coś, co wcześniej próbowałem zautomatyzować (chociaż użyłem czegoś podobnego w sposób ręczny, aby zwiększyć luki w procesie Java, zanim go wypuszczę), więc mogą być inne problemy, które przeoczyłem.

1

Myślę, że najbardziej bezpośrednią odpowiedzią na twoje pytanie jest użycie pbind do wiązania działającego procesu powłoki, a następnie uruchomienie Java z tej powłoki. Zgodnie ze stroną man efekty pbind są dziedziczone przez procesy tworzone z powiązanego procesu.Wypróbuj to:

% pbind -b 0 $$ 
% java ... 
Powiązane problemy