2016-03-04 17 views
8

Nella mia esperienza odierna, trovo che Java VisualVM di Oracle mostra l'utilizzo della CPU come percentuale dei core totali della macchina, anche quando la JVM monitorata ha un'affinità di processo limitata impostata nel sistema operativo. Questo è nella scheda "monitor".Java VisualVM Utilizzo della CPU e affinità del processore

Limitare la jvm monitorato con taskset (su Linux, Ubuntu), quando i processori consentiti a quell'utente jvm sono vicino utilizzazione 100% in htop, la percentuale CPU mostrata in VisualVM è chiaramente uguale al numero totale di CPU diviso per il numero di processori autorizzati al jvm monitorato. La risoluzione della scala è quindi inadeguata per questo caso.

Potete confermare di aver osservato lo stesso su altri sistemi operativi o in generale?

C'è un modo per avere account VisualVM solo per core assegnati da affinità quando si mostra l'utilizzo della CPU?

risposta

5

Secondo VisualVM source code, l'utilizzo della CPU è infatti calcolato come tempo di CPU totale diviso per il numero di processori:

long processCpuTime = tracksProcessCpuTime ? 
     model.getProcessCpuTime()/processorsCount : -1; 

dove processorsCount è ottenuta da OperatingSystemMXBean:

OperatingSystemMXBean osbean = mxbeans.getOperatingSystemMXBean(); 
    if (osbean != null) processorsCount = osbean.getAvailableProcessors(); 

C'era un bug JVM di vecchia data JDK-6515172, che l'affinità di processo non è stata presa in considerazione, ovvero getAvailableProcessors restituiva sempre il numero totale di CPU indipendentemente dal set di attività. Questo era specifico per Linux e BSD; ha funzionato normalmente su Solaris e Windows.

Circa un mese fa questo bug è stato finalmente risolto. La correzione, tuttavia, è valida solo per JDK 9.

Vedere this question per possibili soluzioni alternative. Sono un po 'brutti però.