2016-03-04 17 views
8

Z doświadczenia wiem, że Java VisualVM firmy Oracle pokazuje użycie procesora jako procent wszystkich rdzeni maszyny, nawet jeśli monitorowana maszyna JVM ma ograniczone powinowactwo procesu w systemie operacyjnym. To jest w zakładce "monitor".Wykorzystanie procesora Java VisualVM i powinowactwo procesora

Ograniczenie monitorowany JVM z taskset (na Linux Ubuntu), gdy procesory pozostawiono do tego JVM są bliskie 100% wykorzystania w htop odsetek procesora pokazano na VisualVM jest wyraźnie równa całkowitej liczby procesorów, podzielonej przez liczba procesorów dozwolonych do monitorowanego jvm. Rozdzielczość skali jest zatem niewystarczająca w tym przypadku.

Czy możesz potwierdzić, że zaobserwowałeś to samo w innych systemach operacyjnych lub ogólnie?

Czy istnieje sposób, aby mieć konto VisualVM tylko dla rdzeni o przypisanym powinowactwie przy wyświetlaniu użycia procesora?

Odpowiedz

5

Według VisualVM source code wykorzystanie procesora rzeczywiście oblicza się jako sumę czasu procesora, podzielonej przez liczbę procesorów:

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

gdzie processorsCount otrzymuje się OperatingSystemMXBean:

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

nie została długotrwały błąd JVM JDK-6515172, że powinowactwo procesu nie zostało uwzględnione, tj. getAvailableProcessors zawsze zwracał całkowitą liczbę procesorów bez względu na zestawy zadań. Było to specyficzne dla Linuksa i BSD; pracował normalnie w systemie Solaris i Windows.

Około miesiąca temu ten błąd został ostatecznie rozwiązany. Poprawka jest jednak tylko dla JDK 9.

Spójrz na this question, aby zobaczyć możliwe obejścia. Są jednak nieco brzydcy.

Powiązane problemy