Monitorowanie użycia procesora - CPU utilization
W artykule nie znajdziecie informacji o popularnych "monitorach systemu", takich jak gdesklets, conky czy karamba. Zajmę się opisem realnego zużycia czasu procesora, średnim obciążeniem oraz pochodnymi tego tematu. Zostaliście ostrzeżeni. Nie będę też opisywał instalacji aplikacji czy miejsca, gdzie można je znaleźć. Nie sądzę, by ktokolwiek miał ban na google i gcc. Większość narzędzi z tego artykułu znajduje się w paczce sysstat znajdującej się w repozytoriach Debiana. No to zaczynamy!
Sposób zarządzania przydziałem czasu CPU w systemie Linux jest troszkę zakręcony. W większości wypadków proces, który okupuje CPU będzie go używał do czasu, aż proces nie zakończy się lub nie przejdzie w stan wstrzymania (oczekiwania). Od tej reguły są wyjątki (jak choćby przerwania SysRQ jądrą lub zaawansowane zapytania poprzez /proc), w większości wypadków jednak sytuacja, w której proces A blokuje czas procesora procesowi B jest dość częsta. Opisywałem niedawno cpulimit, dzięki któremu mamy pewne możliwości sterowania obciążeniem naszego procesora. Istnieją oczywiście bardziej zaawansowane metody, którymi zajmę się troszkę później...
... ponieważ aby zacząć zarządzać naszym procesorem, musimy wiedzieć jakie procesy "siedzą" w maszynie. Najbardziej popularny i najmniej skuteczny jest program
# top
wraz z jego lepszymi pochodnymi - atop/htop. Top sam w sobie jest programem bardzo ograniczonym i nie umożliwia skutecznego monitoringu naszego systemu. Aplikacje atop oraz htop rozszerzają te możliwości, jednak nie w stopniu satysfakcjonującym. (polecam jednak używanie programu htop w codziennym zarządzaniu systemem, znacznie ułatwia pracę).
Drugim, znacznie ciekawszym programem jest:
# mpstat -P ALL
Sposób raportowania zastosowany w tym programie jest przemyślany, strona podręcznika man daje jasny i czysty obraz na działanie programu. Nie będę przepisywał tutaj treści, wystarczy spojrzeć na wynik powyższego polecenia:
19:47:40 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s 19:47:40 all 1,96 0,02 0,62 0,15 0,13 0,13 0,00 96,99 363,19 19:47:40 0 1,75 0,03 0,65 0,23 0,26 0,27 0,00 96,82 363,19 19:47:40 1 2,17 0,02 0,59 0,07 0,00 0,00 0,00 97,16 0,00
Raporty minutowe z działania naszego procesora możemy uzyskać poprzez narzędzie:
# sar
Raport wygląda w następujący sposób:
12:00:02 AM CPU %user %nice %system %iowait %idle 12:10:01 AM all 1.05 0.00 0.28 0.04 98.64 12:20:01 AM all 0.74 0.00 0.34 0.38 98.54 12:30:02 AM all 1.09 0.00 0.28 0.10 98.53 ..... 05:10:01 AM all 8.78 0.00 37.74 0.03 53.44 05:20:02 AM all 8.30 0.00 35.45 0.06 56.18 Średnia: all 3.09 0.00 9.14 0.09 87.68
Sar drukuje na standardowe wyjście kumulatywną aktywność obciążenia systemowego. Można sprawić, aby sar zachowywał się dokładnie tak, jak my będzie tego chcieć. przykładowe wywołanie; 2 sekundy interwału; 5-krotne wywołanie:
# sar -u 2 5
19:52:39 CPU %user %nice %system %iowait %steal %idle 19:52:41 all 0,00 0,00 0,75 0,00 0,00 99,25 19:52:43 all 1,50 0,00 1,00 0,00 0,00 97,51 19:52:45 all 4,00 0,00 1,00 0,00 0,00 95,00 19:52:47 all 3,97 0,00 0,99 0,00 0,00 95,04 19:52:49 all 7,71 0,00 1,99 0,00 0,00 90,30 Średnia: all 3,44 0,00 1,15 0,00 0,00 95,41
Opis wartości:
- %user:Procent obciążenia CPU przy wywołaniu aplikacji z poziomu użytkownika
- %nice: Jak wyżej, zlicza jednak procent obciążenia przez procesy ze zmienionym niceness
- %system: Wykorzystanie CPU przez procesy jądra
- %iowait: Procent czasu, w których procesor(y) był(y) nieużywane podczas gdy system wykonywał zapytania I/O.
- %idle: Jak wyżej, z tym że zlicza procent czasu, w którym procesor i system niczym się nie zajmowały
Sar pozwala na logowanie równoległe do plików tekstowych, obsługuje własny format pliku raportu (binarny), umożliwia działanie poprzez nohup (polecane). Jest to potężne narzędzie i administrator systemu (oraz nawet zwykły użytkownik!) nie powinien o nim zapominać.
Nie zostaje nic więcej, jak sprawdzić, które procesy najmują najwięcej czasu procesora.
# ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10
lub
# ps -eo pcpu,pid,user,args | sort -r -k1 | less
Komendy te podają nam najbardziej zasobożerne procesy w kolejności od najmniej zajmującego czas procesora do najbardziej.
Dodatkowo można posłużyć się poleceniem
# iostat
Które pozwoli na szybkie sprawdzenie stanu naszej jednostki centralnej oraz dysków twardych.
Ostatnią rzeczą, jaką musimy się zająć jest Load Average. Seban opisał to na swojej Jabbie. Dodam jeszcze, że LA >1 przez ostatnie 15 minut jest już czymś, czym musimy się zająć, a LA >2 jest sytuacją wymagającą szybkiej interwencji.
Teraz jesteśmy w stanie monitorować nasz system, dowiadując się którymi procesami mamy się martwić.
W kolejnym odcinku : przygoda z konsolą część trzecia oraz zaawansowane podejście do sygnałów systemowych (sys/signal.h) Linuksa! Enjoy!
Dzięki za kolejny wpis z pożytecznymi informacjami! :)
> okupuje (proces) CPU będzie go używał do czasu, aż proces nie zakończy się
Tak nie do końca. :-) A gdyby tak init miał nie oddać CPU dopóki się nie zakończy? Tak jak napisałeś w Linuksie system szeregowania i podziału czasu jest dość skomplikowany. Proces zwalnia CPU, gdy np. ma coś odczytać z dysku, wtedy CPU jest przejmowany przez inny proces. Jest też wywłaszczanie - system operacyjny może sam odsunąć jakiś proces od CPU, w Linuksie wywłaszczanie działa chyba również na poziomie jądra.
Słuszna uwaga Seban! Napisałem jednak "lub nie przejdzie do idle". Init po wykonaniu wszystkich skryptów z /etc/rcx.d przechodzi w idle z tego co wiem. Nie wiedziałem o tym, że wywołanie I/O zwalnia CPU, dzięki :) Ostatnio siedzę dużo w programowaniu z użyciem bibliotek sys/*, dużo jeszcze nie umiem ale się uczę :).
Co do wywłaszczania - 100% racja.
U znajomego w pracy olewają robienie stron pod Opere. Robią CSS dla Firefoksa, haki dla IE, a Operą się nie interesują. Sam nie wiem czy dobre podejście.
U Twojego znajomego w pracy pracuja sami amatorzy.
Robi się strony dla Firefoksa i Opery z hakami dla MSIE. Jeśli strona działa na tych 3 to zadziała na każdej przeglądarce.
Pozwolę sobie na małą uwagę odnośnie Load Average, napisałeś: "LA >1 przez ostatnie 15 minut jest już czymś, czym musimy się zająć, a LA >2 jest sytuacją wymagającą szybkiej interwencji." Jest to prawdą ale tylko dla maszyn jednoprocesorowych. Jeżeli mamy maszynę 4 prockową, a 3 procesy będą cały czas aktywnie używać procesor to LA będzie wynosić 3 i nie ma najmniejszego powodu do zmartwienia.