Top i ps nie pokazują tego samego wyniku procesora


54

Jest to powiązane z tym pytaniem.

Po uruchomieniu topotrzymuję następujący wynik:

wprowadź opis zdjęcia tutaj

pid 3038używa 18% procesora, jednak podczas działania

wprowadź opis zdjęcia tutaj

wynik wynosi 5,5%. Wydaje się, że liczba ta nie zmienia się z czasem (tj. Po uruchomieniu tego samego polecenia nieco później) ...

Czy pspolecenie w jakiś sposób uśrednia użycie procesora?

Odpowiedzi:


87

man psw NOTESdziale.

   CPU usage is currently expressed as the percentage of time spent running
   during the entire lifetime of a process.  This is not ideal, and it does not
   conform to the standards that ps otherwise conforms to.  CPU usage is
   unlikely to add up to exactly 100%.

I chyba wiesz, ale możesz także:

top -p <PID>

Edycja : co do komentarza do innej odpowiedzi;

Hmm tak, zastanawiam się, jak to uzyskać (natychmiastowy procent procesora) z ps

Krótka odpowiedź: nie możesz.

Dlaczego tak jest

To tak, jakby poprosić kogoś o obliczenie prędkości samochodu na podstawie zdjęcia.

Chociaż topjest narzędziem do monitorowania, psjest narzędziem do tworzenia migawek. Pomyśl o tym w ten sposób: w dowolnym momencie proces albo korzysta z procesora, albo nie. Tak więc masz dokładnie 0% lub 100% obciążenia w tym właśnie momencie.

Dawanie: Jeśli pspowinno dać natychmiastowe użycie procesora , byłoby to 0% lub 100%.

top z drugiej strony utrzymuj numery odpytywania i obliczaj obciążenie w czasie.

psmógł mieć aktualne użycie - ale wymagałoby to wielokrotnego odczytu danych i uśpienia między kolejnymi odczytami. Nie ma

Obliczanie dla ps% cpu

ps oblicza użycie procesora w następujący sposób:

uptime = całkowity czas działania systemu.
ps_time = czas rozpoczęcia procesu mierzony w sekundach od rozruchu.
pu_time = całkowity czas proces wykorzystuje procesor.

;; Trwa proces Seconds:
sekundy = czas pracy - ps_time
;; Stosowanie:
cpu_usage = pu_time * 1000 / sekundy

print: cpu_usage / 10 "." cpu_usage% 10


Przykład: czas pracy = 344,545 ps_time = 322,462 pu_time = 3,383 sekund = 344545 - 322 462 = 22 083 cpu_usage = 3383 * 1000/22 083 = 153 wydruk: 153/10 "." 153% 10 => 15,3

Tak więc wydrukowana liczba to: czas, w którym proces zużywał procesor podczas jego życia. Jak w powyższym przykładzie. Zrobił to w 15,3% swojego życia. W 84,7% przypadków nie powodowało to błędów procesora.

Odzyskiwanie danych

ps, a także topwykorzystuje dane z plików przechowywanych w /proc/systemie pseudo-plikowym z informacjami o procesie .

Niektóre pliki główne /proc/mają różne informacje o ogólnym stanie systemu. Ponadto każdy proces ma własny podfolder, w /proc/<PID>/którym przechowywane są dane specyficzne dla procesu. Na przykład proces z twojego pytania miał folder w /proc/3038/.

Podczas psobliczania zużycia procesora wykorzystuje dwa pliki:

/ proc / uptime Czas pracy systemu (sekundy) i ilość czasu spędzonego na bezczynności (sekundy).
/ proc / [PID] / stat Informacje o statusie procesu.
  • Z uptimeniego korzysta pierwsza wartość ( czas działania ).
  • Z [PID]/statwykorzystuje następujące:
 # Nazwa Opis
14 godzin czasu procesora spędzonego w kodzie użytkownika, mierzonego w jiffies
15 godzin czasu procesora spędzonego w kodzie jądra, mierzonych w jiffies
16 czasu pracy procesora spędzonego w kodzie użytkownika, w tym czas od dzieci
17 cstime czasu procesora spędzonego w kodzie jądra, w tym czas od dzieci 
22 czas rozpoczęcia Czas rozpoczęcia procesu, mierzony w jiffies

Jiffie jest zegar kleszczy. Dodatkowo wykorzystuje różne metody, tj., sysconf(_SC_CLK_TCK)Aby uzyskać Hertz systemu (liczbę tyknięć na sekundę) - ostatecznie wykorzystując 100 jako rezerwę po wyczerpaniu innych opcji.

Jeśli więc utimejest 1234, a Hertz to 100, to:

seconds = utime / Hertz = 1234 / 100 = 12.34

Rzeczywiste obliczenia są wykonywane przez:

total_time = utime + stime

IF include_dead_children
    total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

Przykład (Dane wyjściowe z niestandardowego skryptu Bash):

$ ./psw2 30894
System information
           uptime : 353,512 seconds
             idle : 0
Process information
              PID : 30894
         filename : plugin-containe
            utime : 421,951 jiffies 4,219 seconds
            stime : 63,334 jiffies 633 seconds
           cutime : 0 jiffies 0 seconds
           cstime : 1 jiffies 0 seconds
        starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

Obliczanie „bieżącego” obciążenia za pomocą ps

To jest (nieco?) Podejrzane przedsięwzięcie, ale OK. Spróbujmy.

Można wykorzystać podane czasy psi na tej podstawie obliczyć zużycie procesora. Myślenie o tym może być raczej przydatne, z pewnymi ograniczeniami.

Może to być przydatne do obliczania zużycia procesora w dłuższym okresie. Tzn. Chcesz monitorować średnie obciążenie procesora plugin-containerw Firefoksie podczas wykonywania niektórych zadań związanych z Firefoksem.

Korzystając z danych wyjściowych z:

$ ps -p -o cputime, etimes

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

Używam etimena etimestej próbce, na obliczeniach, tylko być nieco bardziej wyraźne. Dodaję też% procesora dla „zabawy”. W np. Skrypcie bash oczywiście można by użyć etimes- lub lepiej czytać z /proc/<PID>/itp.

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
 6.2 00:14:45    03:56:07   14167

Calculate times:
            13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

            14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

Proces wykorzystywał procesor 38% czasu w tym okresie.

Spójrz na kod

Jeśli chcesz wiedzieć, jak psto zrobić i znać trochę C, zrób to (wygląda na to, że uruchamiasz Gnome Debain deriavnt) - miłe podejście do kodu w odniesieniu do komentarzy itp .:

apt-get source procps
cd procps*/ps
vim HACKING

Mogę aktualizować z większą ilością informacji topi ciągłym monitorowaniem - lub przyciągać przez opóźnienie zwane " ps" bieżącym obciążeniem procesora.
Runium,

2
Naprawdę świetna odpowiedź!
Theodor

A co z obliczaniem całkowitego zużycia procesora w całym systemie. Czy narzędzia próbują uzyskać wykorzystanie procesora za pomocą migawki, czy też uśredniają go w czasie?
CMCDragonkai

4
man top

%CPU  --  CPU usage
The  task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.  In a true SMP environment, if 'Irix
mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.  You toggle  'Irix/Solaris'  modes
with the 'I' interactive command.


man ps 
%cpu       %CPU    cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running                       (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).

Hmm tak i zastanawiam się, jak to uzyskać (natychmiastowy procent procesora) zps
Theodor

2
możesz wyodrębnić z najlepszego przykładutop -p 3343 -n1 | awk '/ R /{print $10}'
Rahul Patil

1
Niesamowite. Przekonałem się, że awk: dla pidlepiej działało, jak wtop -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor

1
Dzięki „top -p” jest fajny, nigdy nie zauważyłem tej opcji! Jednak nie lubię szukać PID, co jeśli przypadkiem te same cyfry pojawią się w sekcji wolnej pamięci lub coś takiego. W moim systemie informacje znajdują się w 8 linii i 9 kolumnie, dlatego też:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.