Jak uzyskać ogólne wykorzystanie procesora (np. 57%) w systemie Linux [zamknięte]


197

Zastanawiam się, w jaki sposób można uzyskać wykorzystanie procesora systemu i przedstawić go w procentach, na przykład za pomocą bash.

Przykładowe dane wyjściowe:

57%

W przypadku, gdy istnieje więcej niż jeden rdzeń, dobrze byłoby obliczyć średni odsetek.


1
@julesanchez wartość musi być potokowana gdzieś indziej, stąd musi być int
użytkownik1199739

robi top> myfile.txt A zastosowanie filtra po obróbce nie jest w porządku?
JuSchz

11
Polecenie, które nie wymaga sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
Ponownie otwierając Nie rozumiem, dlaczego uznano to za nie na temat, czy ci, którzy go zamknęli, chcieliby rozwinąć sprawę?
Jonathan H

3
Moje rozumienie /proc/statjest bardzo ograniczony, ale to jedna wkładka działa wystarczająco dobre dla mnie cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. Za pomocą% .2f możesz kontrolować liczbę miejsc po przecinku, które chcesz wyprowadzać, a za pomocą sleep 1możesz ustawić czas, który chcesz uśrednić , to znaczy, jeśli robi to, co myślę, że robi. Możesz go w mgnieniu oka włączyć, aby przetestować go w czasie rzeczywistym.
Yeti

Odpowiedzi:


174

Spojrzeć na cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

EDYCJA proszę przeczytać komentarze przed skopiowaniem-wkleić to lub użyć tego do jakiejkolwiek poważnej pracy. To nie zostało przetestowane ani wykorzystane, to pomysł dla osób, które nie chcą instalować narzędzia lub czegoś, co działa w dowolnej dystrybucji. Niektórzy uważają, że możesz „apt-get install” cokolwiek.

UWAGA: nie jest to bieżące użycie procesora, ale ogólne użycie procesora we wszystkich rdzeniach od momentu uruchomienia systemu. Może to bardzo różnić się od bieżącego użycia procesora. Aby uzyskać bieżącą wartość, należy użyć góry (lub podobnego narzędzia).

Bieżące użycie procesora można potencjalnie obliczyć za pomocą:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
Ale musisz zainstalować mpstat, tak jak zaleciłeś powyżej. Wiele osób nie ma takiej elastyczności. cat / proc / stat wtedy pipe jest znacznie łatwiejszy niż mpstat, który polecasz.
vimdude

12
+1 Nie rozumiem, dlaczego parsowanie innego narzędzia jest lepsze niż parsowanie/proc/stat
Przywróć Monikę Proszę

9
system + użytkownik + bezczynność = 100%. Więc może coś w stylu: grep 'cpu' / proc / stat | awk '{cpu_usage = (2 $ + 4 $) * 100 / (2 $ + 4 $ + 5 $)} END {print cpu_usage "%"}'
vimdude

106
Myślę, że to rozwiązanie nie pokazuje bieżącego obciążenia procesora, ale średnie obciążenie procesora od momentu uruchomienia procesora.
Etienne

11
@jlliagre, tak to prawda. Aby obliczyć BIEŻĄCE użycie procesora, a nie średnie, musisz wziąć wartość 1 USD, a następnie opóźnić, a następnie przyjąć wartość 1 USD i zobaczyć różnicę. To jest bieżące użycie procesora.
vimdude

102

Możesz spróbować:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
Za każdym razem, gdy uruchamiam to polecenie, otrzymuję dokładnie to samo wyjście ( 32.7%).
alanaktion

13
Dokładniejszy wynik jest podawany, gdy używam top -bn2, ale zajmuje to dużo czasu. Z tego, co przeczytałem, wydaje się, że jest to jedyny sposób na uzyskanie dokładnego wyniku.
alanaktion

7
top -bn1wydaje się bardzo niedokładny w moim systemie FC20. top -bn2wydaje się działać dobrze.
Martin Tournoij

24
Komenda w tej odpowiedzi wydaje się być napisana dla systemów, w których top -vzwraca procps-ng(np. Fedora). Są też procpsznalezione np. Na Ubuntu i CentOS, gdzie polecenie nie działa (zawsze wskazuje 100%, ponieważ parsowanie kończy się niepowodzeniem z powodu wiersza z różnymi formatami liczb procesora). Oto wersja, która działa z obiema implementacjami:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
Dygresja: na OSX, należy stosować następujące: top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mklement0

38

Spróbuj mpstatz sysstatpaczki

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Następnie niektóre cutlub, grepaby przeanalizować potrzebne informacje:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
Nie wierzę, że pokazuje to całkowity procesor
1199739,

Powiedziałbym, że 100% bezczynności to całkowite użycie procesora (w%)
Peter Svensson

To procent wykorzystanego „nie”. Ta odpowiedź była dobra, aż do grep | ogon | część awk ...
jordanm

Zmieniłbym tę awkczęść na awk -F " " '{print (100 - $12)"%"}':, co daje wyjście sformatowane tak, jak chciał, ale poza tym wygląda mi to dobrze.
Dan Fego,

1
@jordanm Wszystkie prawdy; Bardziej głosowałem, bo to działa. Zrobiłbym to osobiście:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

Równie dobrze może rzucić właściwą odpowiedź na moje rozwiązanie, które zostało zainspirowane przez Petera Liljenberga:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Spowoduje to awkwydrukowanie 100 minus 12. pole (bezczynne), po którym będzie znak procentu. awkzrobi to tylko dla linii, w której 12. pole ma tylko liczby i kropki ( $12 ~ /[0-9]+/).

Możesz także uśrednić pięć próbek, w odstępie jednej sekundy:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Przetestuj tak:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
Lepiej jest uruchomić „mpstat 2 1 | ...”, aby wyświetlał statystyki z ostatniej 1 sekundy. W przeciwnym razie, domyślnie mpstat pokazuje statystyki od początku i że nie zmienia się znacznie wraz z upływem czasu
Sarang

1
"mpstat | awk '12 $ ~ /[0-9.]+/ {print 100 - 11 $"% "}'" to działa dla mnie.
AloneInTheDark

@Sarang Dziękuję bardzo !! Wreszcie mogę uzyskać wyświetlane wyniki conky. Niestety, ta linia jest BARDZO powolna, prawie wykonanie całej sekundy zajmuje.
składnia błąd

6
@syntaxerror Zajmuje dokładnie 2 sekundy, ponieważ jeśli spojrzysz na komendę, zobaczysz, że pierwszym argumentem jest to, że jest to interwał, ale wykonuje się tylko raz z powodu drugiego argumentu, więc czeka 2 pełne sekundy, aż zwróci wynik.
Johan Bjäreholt

Pytanie jest zamknięte, więc do mojej dodałem (podobną) odpowiedź :-) Mam nadzieję, że nie masz nic przeciwko. Tak jak ty zainspirowała mnie odpowiedź Petera Liljenberga.
PJ Brunet,

16

ZMIENIONO: Zauważyłem, że w odpowiedzi innego użytkownika% bezczynności było polem 12 zamiast pola 11. Awk został zaktualizowany, aby uwzględniał zmienność pola bezczynności%.

To powinno dać ci pożądaną wydajność:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

Jeśli chcesz zaokrąglić liczbę całkowitą, możesz użyć printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'działa świetnie dla mnie, dzięki. zwróć uwagę na mpstat 11, aby upewnić się, że użycie procesora jest próbkowane przez sekundę
chrishiestand

1
Jeśli masz JQ:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
Niet
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.