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.


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}'

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.


Ł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}'

4

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

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

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}'"


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.


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

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.