Przejdź do treści

Monitoring - źródła danych

Wprowadzenie

Linux oferuje możliwości monitorowania poprzez różne interfejsy, pozwalające administratorom obserwować wydajność i status systemu. Ten artykuł omówi podstawowe źródła danych monitorowania dostępne w jądrze Linux. Zrozumienie tych mechanizmów jest niezbędne przed zagłębieniem się w rozwiązania monitorujące takie jak Zabbix czy Prometheus.

Wirtualny system plików /proc

System plików /proc to wirtualny system plików, który nie istnieje fizycznie na dysku, ale jest tworzony w pamięci podczas uruchamiania systemu. Służy jako interfejs do struktur danych jądra, dostarczając mnóstwo informacji o działającym systemie operacyjnym.

Podstawowe statystyki systemu w /proc

Informacje o procesach (PID)

Każdy uruchomiony proces ma własny katalog w /proc, nazwany jego identyfikatorem procesu. Wewnątrz tych katalogów znajdują się pliki zawierające informacje o danym procesie:

  • /proc/[PID]/status - Zawiera stan procesu, wykorzystanie pamięci i inne szczegóły
  • /proc/[PID]/cmdline - Polecenie, które uruchomiło proces
  • /proc/[PID]/fd/ - Katalog zawierający deskryptory plików
  • /proc/[PID]/maps - Mapy pamięci procesu
  • /proc/[PID]/environ - Zmienne środowiskowe

🔗 Więcej informacji o plikach specyficznych dla procesów w /proc znajdziesz w dokumentacji jądra Linux.

Monitoring

Informacje ogólnosystemowe

Kilka plików dostarcza statystyki ogólnosystemowe:

  • /proc/cpuinfo - Szczegółowe informacje o procesorze(ach)
  • /proc/meminfo - Statystyki wykorzystania pamięci
  • /proc/loadavg - Średnie obciążenie systemu
  • /proc/stat - Różne statystyki systemowe, w tym wykorzystanie CPU
  • /proc/diskstats - Statystyki I/O dysku
  • /proc/net/dev - Statystyki interfejsów sieciowych

Odczytywanie plików /proc

Większość plików /proc można odczytać za pomocą standardowych narzędzi, takich jak cat, less lub grep. Na przykład:

$ cat /proc/cpuinfo
$ cat /proc/meminfo | grep MemFree
$ cat /proc/loadavg

Obliczanie metryk z /proc

Wiele narzędzi monitorujących oblicza pochodne metryki z surowych danych /proc. Na przykład, procentowe wykorzystanie CPU jest obliczane poprzez porównanie wartości z /proc/stat w różnych odstępach czasu:

  1. Odczyt wartości czasu CPU z /proc/stat
  2. Poczekaj określony interwał czasowy
  3. Ponowny odczyt wartości
  4. Obliczenie różnicy wartości
  5. Określenie procentów na podstawie tych różnic

Oto uproszczony przykład obliczania wykorzystania CPU:

# Pierwszy odczyt
user1=$(awk '/^cpu / {print $2}' /proc/stat)
nice1=$(awk '/^cpu / {print $3}' /proc/stat)
system1=$(awk '/^cpu / {print $4}' /proc/stat)
idle1=$(awk '/^cpu / {print $5}' /proc/stat)
iowait1=$(awk '/^cpu / {print $6}' /proc/stat)
total1=$((user1 + nice1 + system1 + idle1 + iowait1))

# Czekaj 1 sekundę
sleep 1

# Drugi odczyt
user2=$(awk '/^cpu / {print $2}' /proc/stat)
nice2=$(awk '/^cpu / {print $3}' /proc/stat)
system2=$(awk '/^cpu / {print $4}' /proc/stat)
idle2=$(awk '/^cpu / {print $5}' /proc/stat)
iowait2=$(awk '/^cpu / {print $6}' /proc/stat)
total2=$((user2 + nice2 + system2 + idle2 + iowait2))

# Oblicz różnice
total_diff=$((total2 - total1))
idle_diff=$((idle2 - idle1))

# Oblicz procentowe wykorzystanie CPU
cpu_usage=$(( 100 * (total_diff - idle_diff) / total_diff ))
echo "Wykorzystanie CPU: $cpu_usage%"

Tak, mamy kompletny skrypt bash do sprawdzania bieżącego użycia, koniec z używaniem top!!! 😙

System plików /sys

System plików /sys (lub interfejs) to kolejny wirtualny system plików, który udostępnia obiekty jądra, sterowniki urządzeń i ich atrybuty. Jest przydatny do monitorowania sprzętu:

  • /sys/class/thermal/ - Czujniki temperatury
  • /sys/class/power_supply/ - Informacje o baterii
  • /sys/devices/system/cpu/ - Informacje o kontroli CPU

Dyski i urządzenia blokowe – /sys/block/

Katalog /sys/block/ zawiera wpisy dla wszystkich urządzeń blokowych, takich jak dyski twarde (sda, nvme0n1, itp.) i ich partycje. Te wpisy mogą dać szczegółowy wgląd w stan i zachowanie urządzeń pamięci masowej.

Każdy podkatalog urządzenia (np. /sys/block/sda/) zawiera różne pliki i podkatalogi, które dostarczają:

a) Statystyki I/O

Znajdujące się w /sys/block/<nazwa_urządzenia>/stat, ten plik dostarcza statystyki takie jak odczyty, zapisy, przeniesione sektory i czas I/O.

Przykład:

cat /sys/block/sda/stat 
# Wyjście: 12345 678 9101112 1314 151617 1819 2021222 2324 0 0 0

Każda kolumna (z dokumentacji jądra) reprezentuje:

  1. Ukończone odczyty
  2. Połączone odczyty
  3. Odczytane sektory
  4. Czas spędzony na odczytywaniu (ms)
  5. Ukończone zapisy
  6. Połączone zapisy
  7. Zapisane sektory
  8. Czas spędzony na zapisywaniu (ms)
  9. Operacje I/O obecnie w toku
  10. Czas spędzony na operacjach I/O (ms)
  11. Ważony czas spędzony na operacjach I/O (ms)

Te statystyki są skumulowane od uruchomienia systemu i mogą być używane do obliczania przepustowości dysku, opóźnień i wykorzystania w czasie.

b) obrotowy vs nieobrotowy

Znajdujący się w /sys/block/<nazwa_urządzenia>/queue/rotational, ten plik wskazuje, czy urządzenie jest tradycyjnym wirującym HDD (1) czy SSD (0).

Przykład:

cat /sys/block/sda/queue/rotational 
# Wyjście: 1 → oznacza dysk obrotowy(HDD)

Może to pomóc zoptymalizować strategie planowania I/O w jądrze lub narzędziach monitorujących.

c) I/O Scheduler

Znajdujący się w /sys/block/<urządzenie>/queue/scheduler, ten plik wymienia dostępne schedulery I/O i wyróżnia aktywny w nawiasach kwadratowych.

Przykład:

cat /sys/block/sda/queue/scheduler 
# Wyjście: none [mq-deadline] kyber bfq

Aby zmienić scheuler (np. na bfq):

echo bfq | tee /sys/block/sda/queue/scheduler

Uwaga: Zmiana scheulera I/O w ten sposób jest zachowana tylko do ponownego uruchomienia. Aby ta zmiana była dostępna również po ponownym uruchomieniu, musisz zmienić tę konfigurację w GRUB lub przez udev. NVMe/SSD zwykle ma własny wbudowany scheuler.

d) Informacje o urządzeniu i topologia

Znajdujące się w:

  • /sys/block/<urządzenie>/device/ – Zawiera atrybuty udev i szczegóły sprzętowe
  • /sys/block/<urządzenie>/queue/logical_block_size – Logiczny rozmiar bloku w bajtach
  • /sys/block/<urządzenie>/queue/physical_block_size – Fizyczny rozmiar bloku (ważny dla SSD)

Inne ważne katalogi /sys

Zarządzanie energią – /sys/power/

Zawiera ogólnosystemowe ustawienia zarządzania energią:

cat /sys/power/state          # Pokazuje dostępne stany uśpienia
cat /sys/power/disk           # Pokazuje tryb zarządzania energią dysku

Informacje o CPU – /sys/devices/system/cpu/

Dostarcza szczegółowych informacji o CPU i kontroli:

# Topologia CPU
ls /sys/devices/system/cpu/cpu0/topology/

# Informacje o częstotliwości CPU
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

# Zarządca CPU (zarządzanie energią)
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Interfejsy sieciowe – /sys/class/net/

Zawiera informacje o interfejsach sieciowych:

# Uzyskaj status interfejsu (up/down)
cat /sys/class/net/eth0/operstate

# Sprawdź prędkość interfejsu
cat /sys/class/net/eth0/speed

# Adres MAC
cat /sys/class/net/eth0/address

System plików /sys jest użym interfejsem jądra zarówno do monitorowania, jak i konfigurowania sprzętu na niskim poziomie. Jeśli chodzi o dyski, /sys/block zapewnia dostęp w czasie rzeczywistym do metryk wydajności I/O, planowania i charakterystyki urządzenia. Narzędzia takie jak iostat, udevadm i smartctl często używają tych danych za kulisami.

System plików /sys jest szczególnie cenny dla skryptów monitorujących, które potrzebują bezpośredniego dostępu do parametrów sprzętowych bez analizowania złożonego wyjścia poleceń. W przeciwieństwie do /proc, który koncentruje się głównie na procesach i statystykach systemowych, /sys jest zorganizowany wokół urządzeń sprzętowych i podsystemów, co czyni go głównym źródłem monitorowania związanego ze sprzętem.

SNMP (Simple Network Management Protocol)

SNMP to standardowy protokół do zbierania i organizowania informacji o zarządzanych urządzeniach w sieciach. Jest szeroko stosowany do monitorowania urządzeń sieciowych i serwerów.

Architektura SNMP

Architektura SNMP składa się z:

  1. Menedżera SNMP - systemu monitorującego, który żąda informacji
  2. Agenta SNMP - oprogramowania działającego na monitorowanych urządzeniach, które zbiera i dostarcza dane
  3. Bazy Informacji Zarządzania (MIB) - hierarchicznej bazy danych definiującej, jakie dane mogą być zbierane
  4. Identyfikatorów Obiektów (OID) - unikalnych identyfikatorów dla każdego punktu danych w MIB

Konfiguracja SNMP w Linuksie

Aby używać SNMP w systemie Linux, musisz zainstalować i skonfigurować agenta SNMP, takiego jak snmpd:

# Zainstaluj agenta SNMP w systemie typu RHEL
$ yum install net-snmp
# W systemie typu Debian
$ apt install snmpd

Plik konfiguracyjny domyślnie znajduje się w /etc/snmp/snmpd.conf. Podstawowa konfiguracja obejmuje:

  1. Ustawienie ciągów community (jak hasła)
  2. Konfigurację kontroli dostępu
  3. Określenie, które informacje systemowe mają być udostępniane

Odpytywanie danych SNMP

Narzędzie snmpwalk może odpytywać wszystkie dostępne dane SNMP z urządzenia. Dla konkretnych wartości używaj snmpget.

Rozszerzenia SNMP specyficzne dla Linuksa

Pakiet net-snmp dostarcza specyficzne dla Linuksa rozszerzenia SNMP, które udostępniają dane z /proc przez SNMP:

  • Wykorzystanie CPU
  • Użycie pamięci
  • Statystyki dyskowe
  • Informacje o procesach
  • Statystyki interfejsów sieciowych

Rozszerzanie SNMP

SNMP może być rozszerzony, aby zbierać niestandardowe metryki poprzez:

  1. Rozszerzenie agenta - pisanie skryptów, które są wykonywane przez agenta SNMP
  2. SNMP traps - asynchroniczne powiadomienia wysyłane z agentów do menedżerów, gdy przekroczone są progi

Narzędzia sysstat

Pakiet sysstat dostarcza zestaw narzędzi do monitorowania wydajności:

  • sar - Raporter aktywności systemu
  • iostat - Statystyki I/O
  • mpstat - Statystyki wieloprocesorowe
  • pidstat - Statystyki dla poszczególnych procesów

Te narzędzia zbierają dane z /proc i formatują je dla łatwiejszego odczytu:

# Zainstaluj agenta SNMP w systemie typu RHEL
$ yum install sysstat
# W systemie typu Debian
$ apt install sysstat

# Zobacz statystyki CPU
$ sar -u 1 5

# Zobacz statystyki pamięci
$ sar -r 1 5

# Zobacz statystyki I/O dysku
$ iostat -x 1 5

Liczniki jądra Linux

Jądro Linux utrzymuje liczniki, które śledzą aktywności systemowe:

  1. netstat - Statystyki sieciowe
  2. vmstat - Statystyki pamięci wirtualnej
  3. perf - Narzędzie do analizy wydajności

Przykłady użycia:

# Połączenia sieciowe
$ netstat -an

# Statystyki pamięci
$ vmstat 1 5

# Liczniki wydajności
$ perf stat -p <PID>

cgroups (Grupy kontrolne)

cgroups to funkcja jądra Linux, która izoluje i śledzi wykorzystanie zasobów przez grupy procesów:

  • Czas CPU
  • Pamięć
  • I/O dysku
  • Przepustowość sieci

Dostęp do danych cgroup można uzyskać przez: - /sys/fs/cgroup/ (cgroups v1) - /sys/fs/cgroup/<kontroler>/<cgroup>/ (cgroups v2)

Zdarzenia jądra przez eBPF

Extended Berkeley Packet Filter (eBPF) to dojrzała technologia, która pozwala programom działać w przestrzeni jądra Linux. Jest coraz częściej używana do monitorowania:

  • Analizy wydajności
  • Monitorowania bezpieczeństwa
  • Inspekcji pakietów sieciowych

Narzędzia takie jak bpftrace i bcc (BPF Compiler Collection) wykorzystują eBPF:

# Liczenie wywołań systemowych według procesu
$ bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[comm] = count(); }'

# Monitorowanie otwierania plików
$ bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s opened %s\n", comm, str(args->filename)); }'

Podsumowanie 💡

Linux dostarcza sporo bogatych interfejsów do monitorowania systemu operacyjnego poprzez system plików /proc, SNMP i inne narzędzia jądra. Te źródła danych tworzą fundament dla bardziej zaawansowanych rozwiązań monitorujących, takich jak Zabbix, Prometheus, Nagios i wiele, wiele innych.

Zrozumienie działania tych podstawowych mechanizmów pomaga administratorom:

  • Skuteczniej diagnozować problemy
  • Tworzyć niestandardowe rozwiązania monitorujące
  • Lepiej interpretować dane wyjściowe narzędzi monitorujących
  • Optymalizować wydajność systemu

W następnej części zagłębię się w to, jak można wykorzystać te źródła danych.