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.
ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
/proc/stat
jest bardzo ograniczony, ale to jedna wkładka działa wystarczająco dobre dla mniecat <(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 1
moż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.Odpowiedzi:
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ą:
źródło
/proc/stat
Możesz spróbować:
źródło
32.7%
).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.top -bn1
wydaje się bardzo niedokładny w moim systemie FC20.top -bn2
wydaje się działać dobrze.top -v
zwracaprocps-ng
(np. Fedora). Są teżprocps
znalezione 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 }'
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 }'
.Spróbuj
mpstat
zsysstat
paczkiNastępnie niektóre
cut
lub,grep
aby przeanalizować potrzebne informacje:źródło
awk
część naawk -F " " '{print (100 - $12)"%"}'
:, co daje wyjście sformatowane tak, jak chciał, ale poza tym wygląda mi to dobrze.mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Równie dobrze może rzucić właściwą odpowiedź na moje rozwiązanie, które zostało zainspirowane przez Petera Liljenberga:
Spowoduje to
awk
wydrukowanie 100 minus 12. pole (bezczynne), po którym będzie znak procentu.awk
zrobi 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:
Przetestuj tak:
źródło
conky
. Niestety, ta linia jest BARDZO powolna, prawie wykonanie całej sekundy zajmuje.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ść:
Jeśli chcesz zaokrąglić liczbę całkowitą, możesz użyć printf:
źródło
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ęmpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'