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.

użytkownik1199739
źródło
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)
vimdude
źródło
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"%"}'
netcoder
źródło
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
Peter Svensson
źródło
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"%"}'
Dan Fego
źródło
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) }'
Jordan
źródło
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