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.


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).


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

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


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.

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.