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.
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:
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:
- Odczyt wartości czasu CPU z
/proc/stat
- Poczekaj określony interwał czasowy
- Ponowny odczyt wartości
- Obliczenie różnicy wartości
- 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:
Każda kolumna (z dokumentacji jądra) reprezentuje:
- Ukończone odczyty
- Połączone odczyty
- Odczytane sektory
- Czas spędzony na odczytywaniu (ms)
- Ukończone zapisy
- Połączone zapisy
- Zapisane sektory
- Czas spędzony na zapisywaniu (ms)
- Operacje I/O obecnie w toku
- Czas spędzony na operacjach I/O (ms)
- 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:
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:
Aby zmienić scheuler (np. na bfq
):
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:
- Menedżera SNMP - systemu monitorującego, który żąda informacji
- Agenta SNMP - oprogramowania działającego na monitorowanych urządzeniach, które zbiera i dostarcza dane
- Bazy Informacji Zarządzania (MIB) - hierarchicznej bazy danych definiującej, jakie dane mogą być zbierane
- 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:
- Ustawienie ciągów community (jak hasła)
- Konfigurację kontroli dostępu
- 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:
- Rozszerzenie agenta - pisanie skryptów, które są wykonywane przez agenta SNMP
- 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 systemuiostat
- Statystyki I/Ompstat
- Statystyki wieloprocesorowepidstat
- 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:
- netstat - Statystyki sieciowe
- vmstat - Statystyki pamięci wirtualnej
- 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.