2009-05-27 11 views
8

Ho un'applicazione che ha una licenza per un numero impostato di cpus e voglio essere in grado di impostare il numero di cpu in cui java viene eseguito a 1 prima del controllo. Sto eseguendo Solaris e ho visto pbind ma ho pensato che se avessi avviato l'applicazione e poi avessi usato pbind, avrebbe controllato la licenza prima di aver impostato il numero di CPU che java poteva usare.Impostazione java per utilizzare una cpu

Qualcuno conosce un modo per avviare un'applicazione con un determinato numero di CPU su Solaris?

risposta

3

Si tratta di una soluzione, ma utilizzando Solaris 10 è possibile impostare una zona con una singola CPU disponibili e quindi eseguire l'applicazione all'interno di quella zona.

Se si vuole fare test senza eseguire l'applicazione completa, questo po 'di Java è più probabile che cosa stanno usando per ottenere il numero di CPU:

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

Un esempio completo here.

+0

Sarei piuttosto interessato a sapere se l'uso di pbind modifica il risultato di availableProcessors(). –

+0

Dovrebbe fare, taskset cambia i risultati di availableProcessors(). –

1

Questa non è una soluzione completa, ma potrebbe essere sufficiente per svilupparla. C'è sicuramente un punto in cui esiste il processo java (e quindi può essere controllato da pbind) ea quel punto non è ancora stato eseguito il codice per eseguire il controllo del processore. Se si potesse mettere in pausa il lancio dell'applicazione stessa fino a quando pbind non ha fatto il suo lavoro, questo dovrebbe essere OK (supponendo che l'idea di pbind funzioni dal punto di vista del controllo della CPU).

Un modo per eseguire questa operazione che dovrebbe sospendere definitivamente la JVM in un punto appropriato è il socket socket per i debugger remoti e l'avvio con la modalità suspend. Se si passa i seguenti argomenti al java invocazione:

-Xdebug -Xrunjdwp: trasporti = dt_socket, indirizzo = 8000, sospendere = y, server = y

allora la JVM farà una pausa dopo l'avvio il processo java ma prima dell'esecuzione della classe principale, finché un debugger/agent non è collegato alla porta 8000.

Quindi forse sarebbe possibile utilizzare uno script wrapper per avviare il programma in background con questi parametri, per un in secondo luogo, utilizzare pbind per impostare il numero di processori su uno per il processo java, quindi a ttach e scollega qualche agente sulla porta 8000 (che sarà sufficiente per far sì che Java esegua l'esecuzione).

I difetti o potenziali intoppi in questa idea sarebbero se l'esecuzione in modalità di debug influenzi notevolmente le prestazioni della tua app (non sembra avere un grande impatto in generale), indipendentemente dal fatto che tu possa controllare un qualche tipo di no-op Agente JDWP dalla riga di comando e se è possibile aprire le porte sulla macchina. Non è qualcosa che ho provato ad automatizzare prima (anche se ho usato qualcosa di molto simile in modo manuale per aumentare lo nice di un processo Java prima di lasciarlo libero), quindi potrebbero esserci altri problemi che ho trascurato.

1

Penso che la risposta più diretta alla tua domanda sia l'uso di pbind per associare il processo di shell in esecuzione e quindi avviare Java da quella shell. Secondo la pagina man gli effetti di pbind sono ereditati da processi creati da un processo associato.Prova questo:

% pbind -b 0 $$ 
% java ... 
Problemi correlati