Za każdym razem uzyskiwanie tego samego procesora.

13

Kiedy wykonuję następujące polecenie, aby uzyskać użycie procesora, uzyskuję ładne + użycie procesora przez użytkownika.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Wynik:

14.5

Tutaj mam problem z tym, że wynik zależy od polecenia top, więc nie zmienia się natychmiast jak polecenie top. Więc nie otrzymuję od razu poprawnego procesora. Daje to samo wyjście i nie zmienia się.

Chcę uzyskać dane wyjściowe procesora w czasie rzeczywistym. Pomóż mi ulepszyć moje polecenie.

Ketan Patel
źródło
1
A pytanie brzmi?
Dennis Kaarsemaker
Spróbuj uruchomić polecenie poprzedzone znakiem time. W moim systemie zajmuje to tylko 0,165 sekundy.
depquid
Proszę dać mi edytowane polecenie.
Ketan Patel
Spróbuj:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid
brak różnic w produkcji, po przetestowaniu w różnych systemach
Ketan Patel

Odpowiedzi:

13

Masz rację, topwygląda na to, że przy pierwszej iteracji daje nieprawidłowe użycie procesora. Możesz obejść ten problem w następujący sposób:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Zajmie to oczywiście dwa razy więcej czasu, ale i tak zadziała.

Jeśli nadal chcesz, aby działał szybciej, możesz użyć -dopcji, np. W przypadku 1-sekundowego całkowitego okresu pomiaru użyj jego połowy:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Ruslan
źródło
serverfault.com/a/436499/134517 również zajmie znacznie więcej niż dwa razy, ponieważ zajmie to około jednej sekundy zamiast prawie żadnej.
altendky
Oprócz komentarza altendky, zobacz także odpowiedź terdona, aby wyjaśnić, dlaczego problem jest na pierwszym miejscu.
Ruslan
6

Technicznie pierwszy topnie zawsze wyświetla tę samą wartość; po prostu wyświetla średnie obciążenie procesora od ostatniego uruchomienia. Ponieważ topużywa delty /proc/statstatystyk do obliczania obciążenia procesora, pierwsza wartość jest obliczana podczas porównywania z zerem, dając niepoprawny (ale WAD) wynik.

Jeśli nie chcesz używać top, możesz bezpośrednio przeanalizować /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

W ten sposób jest także szybszy i dokładniejszy.

Możesz to przetestować za pomocą stress:

stress -c 1 -q &

I robić

killall stress

po.


źródło
Ładny. A jeśli twoje polecenie zostanie umieszczone w pliku o nazwie „cpu”, watchmożesz je na nim uruchomić:watch -n1 "bash ./cpu"
Brent Faust
Twój skrypt awk do przeanalizowania /proc/statjest całkiem fajny, ale wydaje się, że ma tę samą wadę, co pierwsza iteracja top: wyświetla średnie obciążenie procesora od ostatniego uruchomienia, a nie bieżące.
pieroxy
5

Aby rozwinąć odpowiedź @ Ruslan, topdzieli użycie procesora między użytkownika, procesy systemowe i niceprocesy, chcemy sumę tych trzech. Możemy więc działać topw btrybie ATCH, który pozwala nam analizować jego dane wyjściowe. Jednak, jak wyjaśniono tutaj , pierwsza iteracja top -bzwraca wartości procentowe od uruchomienia, dlatego potrzebujemy co najmniej dwóch iteracji ( -n 2), aby uzyskać bieżący procent. Aby przyspieszyć, możesz ustawić dopóźnienie między iteracjami na 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
terdon
źródło
4

Może użyj tego opartego na psdanych wyjściowych:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }
GHugo
źródło
0

Użyj polecenia watch lub pętli w powłoce,

to znaczy watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"

stokrotka
źródło
To samo dzieje się z zegarkiem
Ketan Patel
0

Dlaczego zależy ci na wykorzystaniu procesora? Średnie obciążenie jest znacznie lepszy wskaźnik:

cat /proc/loadavg

Jeśli naprawdę potrzebujesz użycia procesora, parsowanie /proc/statjest prawdopodobnie najlepszym rozwiązaniem.

Martin von Wittich
źródło
1
Przeciętne obciążenie jest zasadniczo całką czasową użycia procesora (podzieloną przez czas). Dlaczego powiedziałbyś, że integralna cecha jest znacznie lepszym wskaźnikiem [wszystkiego] niż różnicowa, skoro mają zupełnie inne przypadki użycia? Ponadto, /proc/statnie podaje zużycia procesora w obecnym stanie, należy go przeczytać dwa razy z pewnym odstępem czasu między odczytami i wykonać pewne obliczenia, aby uzyskać użycie procesora. To właśnie toprobi.
Ruslan
Nie umiem matematyki, więc muszę przyznać, że tak naprawdę nie rozumiem różnicy między całką a różnicą: / „Średnia obciążenia jest zasadniczo całką czasową użycia procesora” - czy to naprawdę? AFAIK proces, który zawiesza się w stanie D, powoduje wzrost obciążenia, ale nie wymaga użycia procesora. „Dlaczego miałbyś powiedzieć ...” - OP nie mówi, co naprawdę chce osiągnąć, więc szczerze mówiąc, zakładam, że chce zmierzyć obciążenie systemu i pomyślał, że użycie procesora będzie najlepszym wskaźnikiem tego , więc poleciłem mu ładować średnią.
Martin von Wittich,
Z Twojego linku: „Systemy obliczają średnią obciążenia jako wykładniczo tłumioną / ważoną średnią ruchomą liczby obciążenia”. oraz „obciążenie systemu jest miarą ilości pracy obliczeniowej”. Stan D nie wymaga żadnej pracy obliczeniowej. Potrzebne są procesy wykorzystujące czas procesora. Tak więc średnie obciążenie to w zasadzie procent czasu, przez który procesor nie był bezczynny przez pewien okres czasu (powiedzmy od minut do dziesiątek minut). Zużycie procesora to procent czasu, w którym procesor nie jest bezczynny w skali czasu w milisekundach - tj. Aktualizowany za każdym razem, gdy go czytasz i odzwierciedla bieżący stan.
Ruslan
-2

Za pomocą sarpolecenia

sar 1 10

Oznacza to: uzyskaj 10-krotny wynik w każdej sekundzie

Philip Ngun
źródło