„htop” nie pokazuje prawidłowego procentu procesora, ale „top”

12

Podczas pracy mencoderz wątkami = 4 (na czterordzeniowym procesorze). Zauważyłem, że htopnie pokazuje to faktycznego wykorzystania procesora, ale toptak jest.

Wygląda na to, że htop raportuje tylko na jednym rdzeniu . Czy to błąd / ograniczenie htopa ? Co tu się dzieje?

Brak innych wpisów dla mencoder wyświetlanych w pslub htoplub top. Zakładam, że 100% oznacza, że ​​1 rdzeń jest maksymalnie wykorzystany, ale nawet to wydaje mi się dziwne; co z pozostałymi rdzeniami?

Aktualizacja: dodano wyjście „Monitor systemu”

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
Peter.O
źródło
Jakich flag używasz do htopa?
sep332
sep332 ... Właśnie uruchamiam „htop” ... więc jest to przypadek domyślnych wartości.
Peter.O
Bingo! sep332 .. odpowiedz na to pytanie, a ja zaznaczę, że jest rozwiązany. Sprawiłeś, że spojrzałem na moje ustawienia domyślne ... „H” to klawisz przełączania do „Ukryj wątki użytkownika” ... Gdy wszystko inne zawiedzie ” Przeczytaj pomoc informacyjną ”, ale czasem przydatna wskazówka w odpowiednim directon pomaga więcej .. Dzięki.
Peter.O
@ Peter.O: Przypadkowo przegłosowano (touchpad myszy!). Anuluję go, jeśli edytujesz swój post.
SabreWolfy

Odpowiedzi:

24

Jak sam powiedziałeś, możesz nacisnąć przycisk, Haby wyświetlić wątki użytkownika.

Tylko dla odniesienia w przyszłości (i dla zabawy), Policzmy wykorzystanie procesora!

Trochę tła:

W nowoczesnym systemie operacyjnym istnieje program planujący. Ma to na celu zapewnienie, że wszystkie procesy i ich wątki mają równy udział czasu obliczeniowego. Nie będę się zbytnio planował (to naprawdę skomplikowane). Ale w końcu jest coś, co nazywa się kolejką uruchamiania . W tym miejscu wszystkie instrukcje wszystkich procesów ustawiają się w kolejce, aby poczekać na wykonanie kolejki.

Każdy proces umieszcza swoje „zadania” w kolejce uruchamiania, a gdy procesor jest gotowy, odsuwa je i wykonuje. Na przykład, gdy program przechodzi w tryb uśpienia, usuwa się z kolejki uruchamiania i wraca do „końca linii”, gdy jest gotowy do ponownego uruchomienia.

Sortowanie w tej kolejce ma związek z priorytetem procesów (zwanym także „ładną wartością” - tzn. Proces jest niezły pod względem zasobów systemowych).

Długość kolejki określa obciążenie systemu. Na przykład obciążenie 2,5 oznacza, że ​​dla każdej instrukcji, z którą CPU może sobie poradzić w czasie rzeczywistym, są instrukcje 2,5 .

Nawiasem mówiąc, w systemie Linux obciążenie to jest obliczane w odstępach 10 ms (domyślnie).

Teraz na wartości procentowe wykorzystania procesora:

Wyobraź sobie, że masz dwa zegary, jeden nazywa się ti reprezentuje czas rzeczywisty . Mierzy sekundę na każdą sekundę. Drugi zegar, który nazywamy c. Działa tylko wtedy, gdy jest do przetworzenia. Oznacza to, że tylko gdy proces oblicza coś, zegar działa. Nazywa się to również czasem procesora. Każdy proces w systemie „ma” jeden z nich.

Wykorzystanie procesora można teraz obliczyć dla jednego procesu:

U = c / t = 0,5 s / 1 s = 0,5

lub dla wszystkich procesów:

alternatywny tekst

Na maszynie wielordzeniowej może to oczywiście dać wartość 3,9, ponieważ procesor może obliczyć obliczenia o wartości czterech sekund co sekundę, jeśli zostanie to doskonale wykorzystane.

Wikipedia podaje ten przykład:

Aplikacja działająca na 6-procesorowym komputerze z systemem UNIX tworzy trzy procesy UNIX w celu spełnienia wymagań użytkownika. Każdy z tych trzech procesów tworzy dwa wątki. Praca aplikacji jest równomiernie rozłożona na 6 niezależnych wątków wykonania utworzonych dla aplikacji. Jeśli nie jest wymagane oczekiwanie na zasoby, całkowity czas pracy procesora będzie sześciokrotnie przekraczany w czasie rzeczywistym.

Oto mały fragment kodu python, który to robi

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %

W idealnym świecie można wywnioskować, że obciążenie systemu wynosi 100 - 66,93 = 33,1%. (Ale w rzeczywistości byłoby to błędne z powodu skomplikowanych rzeczy, takich jak oczekiwanie we / wy, planowanie nieefektywności itp.)

W przeciwieństwie do obciążenia , obliczenia te zawsze będą skutkowały wartością między 0 a liczbą procesorów, tj. Między 0 a 1 lub 0 do 100%. Obecnie nie ma sposobu na rozróżnienie między komputerem, na którym są uruchomione trzy zadania, wykorzystujące 100% procesora, a komputerem, na którym działa milion zadań, wykonując prawie dowolną pracę na jednym z nich, również na poziomie 100%. Jeśli na przykład próbujesz zrównoważyć kilka procesów na wielu komputerach, wykorzystanie procesora jest prawie bezużyteczne. Ładunek jest tam, czego chcesz.

Teraz w rzeczywistości istnieje więcej niż jeden z tych zegarów przetwarzających. Na przykład jeden czeka na I / O. Możesz więc obliczyć wykorzystanie zasobów we / wy.

Może to nie było pomocne w stosunku do pierwotnego pytania, ale mam nadzieję, że jest interesujące. :)

Stefano Palazzo
źródło
Powinienem był naprawdę uwzględnić wartości niepewności, ponieważ przy użyciu tej prostej metody obliczenia prawdopodobnie zostaną wyłączone o ± 1%, ale nie chciałem nudzić wszystkich zbyt mocno.
Stefano Palazzo
Dzięki za lekcję. Wiedziałem większość, ale kilka rzeczy było bardziej szczegółowych niż to, czego się nauczyłem.
NightwishFan,