2016-03-04 12 views
8

Ich finde, dass Oracle Java VisualVM die CPU-Auslastung als Prozent der gesamten Rechnerkerne zeigt, auch wenn die überwachte JVM eine begrenzte Prozessaffinität im Betriebssystem hat. Dies ist in der Registerkarte "Monitor".Java VisualVM CPU-Auslastung und Prozessor-Affinität

Begrenzung des überwachten JVM mit taskset (auf Linux, Ubuntu), wenn die auf diese JVM erlaubt Prozessoren sind in der Nähe von 100% Auslastung in htop die CPU Prozentsatz in VisualVM gezeigt ist deutlich gleich der Gesamtzahl der CPUs durch die geteilten Anzahl der erlaubten Prozessoren für den überwachten jvm. Die Auflösung der Skala ist daher für diesen Fall nicht ausreichend.

Können Sie bestätigen, dass Sie dasselbe auf anderen Betriebssystemen oder im Allgemeinen beobachtet haben?

Gibt es eine Möglichkeit, VisualVM-Konto nur für affinitätszugewiesene Kerne zu verwenden, wenn die CPU-Nutzung angezeigt wird?

Antwort

5

Nach VisualVM source code wird die CPU-Auslastung in der Tat als Gesamt-CPU-Zeit nach der Anzahl der Prozessoren aufgeteilt berechnet:

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

wo processorsCount von OperatingSystemMXBean erhalten:

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

Es wurde ein langjähriger JVM-Bug JDK-6515172, dass die Prozessaffinität nicht berücksichtigt wurde, also getAvailableProcessors gab immer die Gesamtanzahl der CPUs unabhängig von Tasks zurück. Dies war spezifisch für Linux und BSD; hat normalerweise unter Solaris und Windows gearbeitet.

Vor etwa einem Monat wurde dieser Fehler endgültig gelöst. Das Update ist jedoch nur für JDK 9.

Betrachten Sie this question für mögliche Problemumgehungen. Sie sind jedoch etwas hässlich.