2012-01-16 8 views
30

Stiamo analizzando i programmi Java esistenti. Sono applicazioni threaded progettate per beneficiare di CPU multi-core. Vorremmo misurare l'effetto del numero di core sulla velocità di esecuzione, ma non siamo disposti (e non possiamo) a cambiare il codice di queste applicazioni.È possibile forzare un'applicazione Java esistente per utilizzare non più di x core?

Naturalmente, è possibile testare il software su macchine diverse, ma questo è costoso e complicato. Preferiremmo avere una soluzione software.

Nota: si può presumere che la piattaforma di test sia Windows, Linux o Mac. Idealmente, vorremmo essere in grado di eseguire i test su una di queste piattaforme.

+0

Non penso sia controllato nei programmi java, suppongo che sia una decisione specifica del sistema operativo. Sono curioso di vedere gli esperti commentare questa domanda. – kosa

+0

Se è necessaria una soluzione/personalizzazione software personalizzata che molto probabilmente sarà molto più costosa dell'hardware stesso. E non sono sicuro che tu possa forzare un programma java a utilizzare solo un core in ogni momento. Cose correlate a OS/JVM – fmucar

+0

Considerare l'esecuzione all'interno di una macchina virtuale come VirtualBox. Hai quindi una semplice GUI per determinare la potenza della CPU disponibile per l'istanza. –

risposta

32

Si chiama impostazione affinità CPU ed è un'impostazione del sistema operativo per i processi, non specifica di Java.

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

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

Su Mac non sembra come è possibile impostare: https://superuser.com/questions/149312/how-to-set-processor-affinity-on-os-x

+0

Inoltre, consulta https://github.com/peter-lawrey/Java-Thread-Affinity per una libreria java che può aiutarti con i tuoi test. – philwb

+0

Inoltre (nonostante possa dipendere dall'implementazione), se si imposta l'affinità CPU * prima di * richiamando 'Runtime.getRuntime(). AvailableProcessors()', questo metodo rifletterà la modifica e restituirà il numero (ridotto) di core * disponibile * per la JVM - in conformità con il suo [javadoc] (http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#availableProcessors--). – Bass

-5

Girare il problema a testa in giù; invece di capire come limitare l'applicazione per utilizzare solo core n su un core m, capire come assicurarsi che ci siano solo n core disponibili per l'applicazione. Si potrebbe scrivere un programma molto semplice che mangia un core facendo qualcosa di simile while (true); e iniziare m- n istanze di tale programma in esecuzione alla massima priorità, in modo da garantire che il codice ha solo n core disponibili.

In alternativa, se il BIOS o il sistema operativo consente la disattivazione dei core della CPU, funziona anche. So che gli strumenti di CHUD su Mac OS X erano soliti farlo, ma non ho toccato quegli strumenti sin dall'era G5, quindi potrebbe non funzionare più.

Problemi correlati