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.
command-line
cpu
Ketan Patel
źródło
źródło
time
. W moim systemie zajmuje to tylko 0,165 sekundy.time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
Odpowiedzi:
Masz rację,
top
wygląda na to, że przy pierwszej iteracji daje nieprawidłowe użycie procesora. Możesz obejść ten problem w następujący sposób: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ć
-d
opcji, np. W przypadku 1-sekundowego całkowitego okresu pomiaru użyj jego połowy:źródło
Technicznie pierwszy
top
nie zawsze wyświetla tę samą wartość; po prostu wyświetla średnie obciążenie procesora od ostatniego uruchomienia. Ponieważtop
używa delty/proc/stat
statystyk 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
:W ten sposób jest także szybszy i dokładniejszy.
Możesz to przetestować za pomocą
stress
:I robić
po.
źródło
watch
możesz je na nim uruchomić:watch -n1 "bash ./cpu"
/proc/stat
jest 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.Aby rozwinąć odpowiedź @ Ruslan,
top
dzieli użycie procesora między użytkownika, procesy systemowe inice
procesy, chcemy sumę tych trzech. Możemy więc działaćtop
wb
trybie ATCH, który pozwala nam analizować jego dane wyjściowe. Jednak, jak wyjaśniono tutaj , pierwsza iteracjatop -b
zwraca wartości procentowe od uruchomienia, dlatego potrzebujemy co najmniej dwóch iteracji (-n 2
), aby uzyskać bieżący procent. Aby przyspieszyć, możesz ustawićd
opóźnienie między iteracjami na0.01
:źródło
Może użyj tego opartego na
ps
danych wyjściowych:źródło
Użyj polecenia watch lub pętli w powłoce,
to znaczy
watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"
źródło
Dlaczego zależy ci na wykorzystaniu procesora? Średnie obciążenie jest znacznie lepszy wskaźnik:
Jeśli naprawdę potrzebujesz użycia procesora, parsowanie
/proc/stat
jest prawdopodobnie najlepszym rozwiązaniem.źródło
/proc/stat
nie 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śnietop
robi.Za pomocą
sar
poleceniaOznacza to: uzyskaj 10-krotny wynik w każdej sekundzie
źródło