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.