10 narzędzi które powinien znać każdy administrator

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