Uzyskiwanie użycia procesora w czasie rzeczywistym

11

Kiedy wykonuję następujące polecenie, aby uzyskać użycie procesora, otrzymuję ł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ć użycie procesora w czasie rzeczywistym w danych wyjściowych. Pomóż mi ulepszyć moje polecenie.

Ketan Patel
źródło
monitorowanie w czasie rzeczywistym askubuntu.com/questions/293426/…
Qasim
Ten prosty skrypt bash robi to tylko: askubuntu.com/a/450136/243213
Craig van Tonder

Odpowiedzi:

20

Jeśli możesz sobie pozwolić na opóźnienie wynoszące jedną sekundę, wydrukuje to użycie procesora jako prosty procent:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Bez jednosekundowego opóźnienia vmstatmożna wydrukować tylko wartości średnie od uruchomienia).

Paweł
źródło
Nie daje mi dokładnego% (w porównaniu z htopem)
lepe
1
Musisz użyć w vmstat 1 2ten sposób: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] W przeciwnym razie vmstatpodasz wartości od bootowania, co prawdopodobnie nie jest tym, czego szukasz.
Joe
Joe dziękuję, że to działa. proszę Pawle, edytuj odpowiedź, aby każdy mógł zobaczyć poprawną linię poleceń
Pavlos Theodorou
Dzięki za złapanie tego, Joe i Pavlos! Nie zauważyłem tej części strony podręcznika.
Paul
9

Jest to znany problem z top. 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. topdzieli użycie procesora między użytkownika, procesy systemowe i niceprocesy, chcemy sumę trzech. Wreszcie grepwiersz zawierający procenty procesora, a następnie wykorzystany gawkdo zsumowania procesów użytkownika, systemu i ładnych procesów:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode
terdon
źródło
Każda inna metoda, w tym sar, mpstat ... itd. Pokazuje 2/3%, podczas gdy to polecenie zawsze pokazuje 50%.
CMCDragonkai
@CMCDragonkai liczby powinny się zmienić (właśnie to sprawdziłem) czy jesteś pewien, że poprawnie skopiowałeś / wkleiłeś? Należy również pamiętać, że w systemach z wieloma procesorami procesory topbędą zgłaszać procent użycia jako procent jednego procesora. Oznacza to, że często otrzymasz znacznie wyższy odsetek. Zobacz punkt 9 tutaj .
terdon
Myślę, że to polecenie może być niezgodne z moim systemem. Ale oczywiste jest, że wszystkie inne metody, które wypróbowałem, dają mi procent 1/2/3%, co widzę, gdy uruchamiam htop, podczas gdy to polecenie powoduje anomalię.
CMCDragonkai
@CMCDragonkai z powodu wielu procesorów. Możesz uzyskać liczbę zwróconą przez to i podzielić przez liczbę rdzeni lub możesz użyć topw trybie interaktywnym (po prostu uruchom top), a następnie naciśnij I(shift + i), aby zobaczyć podział według rdzeni.
terdon
Mam tylko 1 procesor.
CMCDragonkai
7

Próbowałem na kilka sposobów, ale wydaje mi się to najbardziej dokładne:

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

Mam to stąd

lepe
źródło
mój linux (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP Sat 19 maja 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) nie ma kolumny $ 15 (linia procesora pliku / proc / stat) : cpu 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou
1
Najlepsza odpowiedź! Dzięki! Moja odmiana: cat <(grep 'cpu' / proc / stat) <(sleep 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", (13 USD - 2 USD + 15 USD - 4 USD) * 100 / (13 USD - 2 USD + 15 USD - 4 USD + 16 USD - 5 USD)}'
maXp
Różnica polega na tym, że jest drukowany w zaokrągleniu do jednego miejsca po przecinku: %.1fco, moim zdaniem, jest bardziej czytelne dla człowieka i przydatne, jeśli użyjesz tego wyjścia w innych skryptach.
lepe
0

Zastosowanie -n2. Spowoduje to wyświetlenie dwóch wierszy. Pierwszy raz topdrukuje linię nie kwalifikuje się do stanu w tym momencie. Następnie dostosuj skrypt, aby zignorować pierwszy wiersz.

ilp
źródło