Codzienna administracja systemami, to wykonywanie setek poleceń, niekiedy bardzo złożonych, czasem mniej, ale są takie narzędzia bez których nie jesteśmy w stanie sprawnie diagnozować problemów systemowych, ani monitorować bieżącej pracy serwera. Chciałbym Wam przedstawić swoje TOP10 narzędzi bez których nie potrafiłbym pracować.
1. ps
ps - służy do wyświetlenia aktualnie działających procesów w systemie, jest to niezwykle przydatne narzędzie jeśli chcemy sprawdzić PID, zużycie pamięci, czy czas procesora zajmowany przez konkretny proces.
Przykładowe użycie: ps axuw
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 2301 0.0 3.8 131408 19564 ? Sl Feb21 1:05 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
W wyniku otrzymaliśmy wiele informacji, podzielonych w kolumny:
- USER - z jakimi uprawnieniami działa proces (mysql),
- PID - jest to pid procesu w systemie (2301),
- %CPU - procentowe wykorzystanie procesora (0.0%),
- %MEM - przedstawia procentowe zużycie pamięci (0.0%),
- VSZ - wirtualne zużycie pamięci przez proces przedstawiane w KiB (131408),
- RSS - rzeczywista ilość pamięci przyznaną procesowi bez uwzględnienia SWAP (19564),
- TTY - podaje nam terminal w którym pracuje aplikacja, jeśli jest to daemon to najczęstszym wynikiem będzie ?, ponieważ proces jest pozbawiony terminala (działa w tle)
- STAT - stan w którym aktualnie znajduje się proces (Sl) - S = czekający na zdarzenie, l = proces jest wielowątkowy
- START - czas uruchomienia procesu
- TIME - skumulowany czas zużycia procesora zarówna w sekcji user jak i system
- COMMAND - dokładne polecenie jakie zostało wykonane
Więcej informacji znajdziecie w manualu (man ps).
2. top
top - jest narzędziem bardzo zbliżonym działaniem do 'ps', również pokazuje aktualnie działające procesy, ale z tą różnicą, że wyniki prezentuje na bieżąco (częstotliwość odświeżania jest konfigurowalna).
Prezentowane dane możemy sortować dowolnie po wybranym parametrze (Shift + f), osobiście najczęściej używam sortowania po ilości zużytej pamięci SWAP (Shift +f, p), dzięki temu szybko jestem w stanie określić które procesy mają wycieki pamięci, oraz po zużyciu pamięci (Shift +f, n).
Dodatkową zaletą polecenia top jest przedstawienie w bardzo czytelny sposób aktualnego wykorzystania zasobów serwera, na samej górze mamy posegregowane informacji na temat aktualnego LOADu, ilości procesów, wykorzystania CPU, MEM i SWAP.
Wciskając klawisz '1', rozwinie się lista wykorzystania CPU i wyniki będą prezentowane per core każdego procesora.
3. iostat
iostat - jest narzędziem prezentującym wykorzystanie naszych urządzeń blokowych, czyli w praktyce jest to monitorowanie pracy dysków twardych, tzw. I/O. Saturacja dysków twardych jest zjawiskiem bardzo niepożądanym, które automatycznie przekłada się na zwolnienie pracy całego systemu, dzięki iostatowi, możemy szybko się przekonać czy przyczyna naszych problemów leży właśnie w za dużym wykorzystaniu zasobów I/O.
Przykładowe użycie: iostat -x 1
avg-cpu: %user %nice %system %iowait %steal %idle
0,46 0,00 0,08 0,02 0,00 99,44
Device rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm util
sda 0,09 0,77 0,07 0,23 2,69 7,87 35,74 0,00 4,49 0,84 0,02
W wyniku widzimy dane dla naszego urządzenia 'sda'.
- rrqm/s - ilość skolejkowanych żądań odczytu z dysku na sekundę
- wrqm/s - ilość skolejkowanych żądań zapisu na dysk na sekundę
- r/s - ilość odczytów z dysku na sekundę
- w/s - ilość zapisów na dysk na sekundę
- rsec/s - ilość sektorów czytanych na sekundę
- wsec/s - ilość sektorów zapisywanych na sekundę
- avgrq-sz - średni rozmiar w sektorach
- avgqu-sz - średnia wielkość kolejki oczekujących żądań dostępu do dysku
- await - średni czas dostępu do dysku (z uwzględnieniem kolejki) w milisekundach
- svctm - średni czas obsługi żądania w milisekundach
- %util - procentowe zużycie procesora potrzebne do obsłużenia żądania, jeśli wynosi 100% dochodzi do sytuacji saturacji zasobów
Jeśli wskazania iostata pokazują utylizację na poziomie 80-100% należy znaleźć przyczynę i ją wyeliminować, sytuacja ta oznacza, że nasz procesor spędza głównie czas w oczekiwaniu na dane a nie na ich przetwarzaniu.
4. vmstat
vmstat - narzędzie monitorujące wykorzystanie pamięci w naszym systemie.
Przykładowe użycie: vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 1 7292 24436 77408 215936 0 0 1 4 27 25 0 0 99 0
0 0 7292 24428 77408 215928 0 0 0 0 36 36 0 0 100 0
Dzięki vmstatowi możemy sprawdzić wykorzystanie pamięci i procesora naszego serwera.
- procs r - ilość procesów aktualnie czekających na czas procesora
- procs b - ilość procesów aktualnie oczekujących na zdarzenie systemowe (uninterruptible sleep)
- memory swpd - wielkość użytej pamięci SWAP
- memory free - ilość wolnej pamięci
- memory buff - ilość zajętej pamięci na bufory (m.in. uprawnienia do plików)
- memory cache - ilość zajętej pamięci na cache dyskowy (dane z dysku najczęściej czytane są wrzucane do pamięci RAM i z niej podawane)
- swap si - ilość stron pamięci czytanych ze SWAP
- swap so - ilość stron pamięci zapisywany do SWAP
- io bi - ilość bloków czytanych z dysku
- io bo - ilość bloków danych zapisywanych na dysk
- system in - ilość obsługiwanych przerwań na sekundę
- system cs - ilość przełączeń kontekstu procesora
- cpu us - procentowe wykorzystanie procesora w sekcji user
- cpu sy - procentowe wykorzystanie procesora w sekcji system
- cpu id - procentowo wolne zasoby procesora - idle
- cpu wa - procentowe oszacowanie oczekiwania procesora na zasoby np. I/O
Bardzo ważne elementy to procs, mówią nam one o tym czy nasz procesor jest wystarczająco mocny by obsługiwać wszystkie nasze pracujące aplikacje, jeśli liczba przy procs r jest duża oznacza, że tyle procesów oczekuje na obsłużenie. Kolejnym istotnym elementem jest sekcja swap si/so, jeśli mamy duży przyrost w so a nie mamy w si, może to oznaczać, że któryś proces ma wycieki pamięci, ponieważ występuje tylko zrzucanie stron pamięci, a nie ma żadnych odczytów, natomiast w znacznie gorszej dla nas sytuacji, braku pamięci występuje zjawisko (page'ingu), czyli zarówno si jak i so zwiększają się (dużo stron jest czytanych jak i pisanych).
Należy sukcesywnie monitorować pracę naszego serwera, najlepiej za pomocą wykresów (munin, cacti) by móc jednoznacznie określić czy występuje sytuacja braku zasobów, czy po prostu nasz system jest optymalnie wykorzystany. Każdy system jest inny i posiada inną charakterystę pracy, a wzrost niektórych wartości wcale nie musi od razu oznaczać braku zasobów, ale każde takie zjawisko powinno być poddane analizie.
5. pmap
pmap - narzędzie raportujące mapę pamięci dla procesu, dzięki niemu możemy dokładnie odczytać ilość pamięci wykorzystywanej przez proces.
Przykładowe użycie: pmap -x $pid
jamzed@yoursite:~$ pmap -x 26046
26046: tail -f /var/log/apache2/varlog.pl.access.log /var/log/apache2/sysfault.pl.access.log
Address Kbytes RSS Anon Locked Mode Mapping
0061d000 4 - - - r-x-- [ anon ]
00906000 1272 - - - r-x-- libc-2.10.1.so
00a44000 4 - - - ----- libc-2.10.1.so
00a45000 8 - - - r---- libc-2.10.1.so
00a47000 4 - - - rw--- libc-2.10.1.so
00a48000 12 - - - rw--- [ anon ]
00a52000 108 - - - r-x-- ld-2.10.1.so
00a6d000 4 - - - r---- ld-2.10.1.so
00a6e000 4 - - - rw--- ld-2.10.1.so
08048000 52 - - - r-x-- tail
08055000 4 - - - r---- tail
08056000 4 - - - rw--- tail
0915c000 132 - - - rw--- [ anon ]
b7732000 344 - - - r---- locale-archive
b7788000 4 - - - rw--- [ anon ]
b778c000 12 - - - rw--- [ anon ]
bfaad000 84 - - - rw--- [ stack ]
-------- ------- ------- ------- -------
total kB 2056 - - -
6. strace
strace - o strace można pisać godzinami, jest to doskonałe i bardzo zaawansowane narzędzie służące do monitorowania pracy naszych procesów. Główne zalety strace to możliwość podpięcia się do aktualnie pracującej aplikacji w celu "podglądania", co aktualnie się w niej dzieje. strace pokazuje wszystkie wywoływane funkcje przez proces, dzięki temu możemy odczytać np. ile czasu spędza nasza aplikacja na pobieraniu danych z zewnętrznego systemu (bazy danych), ile czasu trwa zapis lub odczyt danych z dysku/na dysk, lub po prostu sprawdzić na czym zawiesza się nasz proces.
Przykładowe użycie w trybie podpinania się: strace -s 8192 -r -p $pid, lub trybie wsadowym: strace ls
Aby biegle odczytywać informacje zwracane przez strace należy znać budowę formatu wyjścia, w przypadku uruchomienia strace ls, otrzymujemy funkcję systemową i argumenty jakie aktualnie są wykonywane, jeśli nie wiemy co robi dana funkcja możemy skorzystać z pomocy manualów, np. man 2 open. (należy mieć zainstalowany pakiet manpages-dev)
Zapraszam do przeczytania również wpisu strace - czyli o śledzeniu słów kilka.
7. ltrace
ltrace - jest to analogicznie działające narzędzie do strace, z tym, że zamiast funkcji systemowych, ltrace pozwala na śledzenie wywołań bibliotecznych.
8. uptime
uptime - to jedne z kluczowych narzędzi, bardzo proste w obsłudze i bardzo użyteczne. Dzięki uptime dowiemy się nie tylko ile czasu nasz system aktualnie już pracuje, ale również poznamy jego load. Czym właściwe jest load? Istnieje bardzo dużo wytłumaczeń na to pytanie, w skrócie load jest przede wszystkim wartością którą należy rozpatrywać indywidualnie na każdym serwerze, load to ilość procesów aktualnie oczekujących na obsługę przez procesor.
Jest to dość kontrowersyjne wytłumaczenie, najprościej to pokazać na przykładzie serwera z jednym procesorem (ponieważ w serwerze 8 core'owym wartość loadu 8 wcale nie musi oznaczać problemów z wydajnością).
Przykładowe użycie: uptime
root@yoursite:/home/jamzed# uptime
19:38:48 up 3 days, 7:07, 5 users, load average: 0.00, 0.02, 0.00
Wynik polecenia mówi nam, że nasz system pracuje 3 dni 7h 7m, zalogowanych aktualnie jest 5 użytkowników, pozostałe 3 wartości to reprezentacji loadu w przedziałach czasowych:
- 1min - 0.00
- 5min - 0.02
- 15min - 0.00
Pierwsza wartość była wyznaczona 1 minutę temu, druga 5 minut temu, trzecia 15 minut temu. Wartość loadu 1 na serwerze z jednym procesorem oznacza, że nasz procesor obsługuje w trybie ciągłym procesy i teoretycznie nic na nic nie czeka, ale wartość pożądana to 0.70-0.80 per core procesora, wtedy możemy mieć pewność, że nie dojdzie do sytuacji kiedy procesy będą musiały oczekiwać na czas procesora.
9. netstat
netstat - to doskonały monitor połączeń sieciowych, który pokaże nam wszystkie trwające aktualnie sesje TCP, otwarte sockety w systemie, również aplikacje które są do nich przybindowane, ale również dzięki netstat'owi możemy poznać trasy routingu.
Przykładowe użycie: netstat -rn
Destination Gateway Genmask Flags MSS Window irtt Iface
195.205.203.224 0.0.0.0 255.255.255.240 U 0 0 0 eth0
0.0.0.0 195.205.203.225 0.0.0.0 UG 0 0 0 eth0
# netstat -nplut
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 2301/mysqld
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 2515/memcached
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 25630/apache2
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 6697/vsftpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 840/sshd
tcp6 0 0 :::113 :::* LISTEN 843/gidentd
tcp6 0 0 :::22 :::* LISTEN 840/sshd
udp 0 0 127.0.0.1:11211 0.0.0.0:* 2515/memcached
# netstat -nap
tcp 0 0 127.0.0.1:11211 127.0.0.1:50655 ESTABLISHED 2515/memcached
- netstat -rn - pokazuje nam aktualne trasy routingu, wraz z domyślną bramą (analogicznie do route -n)
- netstat -nplut - pokaże nam wszystkie procesy wraz z portami do których są przybindowane
- netstat -nap - aktualnie trwające sesje TCP wraz z aplikacjami
Gdy w systemie uruchamiamy jakiś daemon sieciowy, to właśnie netstat nam pokaże czy poprawnie się podpiął do interfejsu, lub kto/co jest z nim połączone.
10. tcpdump
tcpdump - jest snifferem interfejsów sieciowych, gdy chcemy sprawdzić jaki ruch odbywa się na naszym interfejsie sieciowym, lub diagnozujemy problemy z połączeniem, wykorzystamy do tego właśnie tcpdump'a.
Przykładowe użycie: tcpdump -ni eth0 host www.varlog.pl and port 80
20:25:55.370858 IP 195.205.203.232.51875 >195.205.203.232 .80: Flags [S], seq 3417027291, win 5840, options [mss 1460,sackOK,TS val 71849864 ecr 0,nop,wscale 5], length 0
20:25:55.377122 IP195.205.203.232 .80 > 195.205.203.232.51875: Flags [S.], seq 1583835480, ack 3417027292, win 5792, options [mss 1460,nop,nop,TS val 187148228 ecr 71849864,nop,wscale 9], length 0
20:25:55.377144 IP 195.205.203.232.51875 > 195.205.203.232.80: Flags [.], ack 1, win 183, options [nop,nop,TS val 71849865 ecr 187148228], length 0
20:25:57.249727 IP 195.205.203.232.51875 > 195.205.203.232.80: Flags [F.], seq 1, ack 1, win 183, options [nop,nop,TS val 71850334 ecr 187148228], length 0
20:25:57.258143 IP195.205.203.232 .80 > 195.205.203.232.51875: Flags [F.], seq 1, ack 2, win 12, options [nop,nop,TS val 187148416 ecr 71850334], length 0
20:25:57.258160 IP 195.205.203.232.51875 > 195.205.203.232.80: Flags [.], ack 2, win 183, options [nop,nop,TS val 71850336 ecr 187148416], length 0
^C
6 packets captured
11 packets received by filter
tcpdump -ni eth0 host www.varlog.pl and port 80 - oznacza, że chcemy śledzić ruch dot. hosta www.varlog.pl oraz portu 80, nie określamy czy ruch ma być wychodzący czy przychodzący (przełączniki src/dst), więc będziemy sniffować oba przypadki., przełącznik -i służy do określenia intefejsu sieciowego który chcemy podsłuchiwać a -n wyłącza resolve'owanie IP na host (przyśpiesza działanie).
tcpdump jest doskonałym narzędziem do diagnozowania problemów sieciowych, jeśli chcemy sprawdzić czy dany pakiet jest poprawnie przekazywany pomiędzy interejsami, czy dociera do nas, lub czy jest od nas wysyłany. Z dodatkowych przełączników polecam -xXv pozwala na podglądanie zawartości ramek TCP, szczególnie przydatne w przypadku ruchu HTTP.
Podzieliłem się z Wami swoimi narzędziami z listy TOP10, teraz chciałbym abyście Wy w komentarzach podali mi swoje ulubione zabawki ;-)