Kontynuując prace nad GuardX, skupiłem się obecnie na rozszerzeniu jego kompatybilności sprzętowej oraz rozwiązaniu problemu, z którym boryka się każdy administrator monitorujący środowiska oparte na systemie plików ZFS. Wprowadziłem gruntowne zmiany w modułach odpowiedzialnych za analizę pamięci operacyjnej (RAM) oraz monitorowanie nośników danych (SMART i temperatura).
Oto szczegółowe omówienie wprowadzonych nowości i powodów, dla których zdecydowałem się na zmianę logiki działania programu.
Moduł RAM: Koniec z fałszywymi alarmami przez ZFS ARC
Co się zmieniło?
Przebudowałem sposób, w jaki GuardX interpretuje i raportuje zajętość pamięci RAM we FreeBSD. Zamiast pokazywać jedną, zsumowaną wartość, program rozbija teraz pamięć na trzy niezależne odczyty: całkowity RAM, pamięć podręczną ZFS ARC oraz pamięć faktycznie używaną przez aplikacje.
Dlaczego wprowadziłem taką zmianę?
Domyślne zachowanie systemu plików ZFS polega na agresywnym buforowaniu najczęściej używanych danych w pamięci RAM, używając do tego mechanizmu ARC (Adaptive Replacement Cache). ZFS wychodzi z założenia, że wolny RAM to zmarnowany RAM. Kiedy jednak procesy systemowe potrzebują zasobów, ZFS natychmiast zwalnia swój cache i oddaje im miejsce.
Wcześniejsza wersja modułu (podobnie jak większość klasycznych narzędzi monitorujących) widziała ten bufor po prostu jako „zajętą pamięć”, co nierzadko skutkowało fałszywymi alarmami o 95-procentowym obciążeniu serwera.
Obecnie GuardX odpytuje bezpośrednio jądro systemu (korzystając z natywnego API sysctlbyname i gałęzi kstat.zfs.misc.arcstats.size), wyciągając dokładny rozmiar bufora ARC z zerowym narzutem. Wynik prezentuje się teraz tak:
RAM (Total) : [ OK ] Zajętość: 52% (16.3 GB / 31.6 GB)
ZFS ARC : [ INFO ] Zajętość: 35% (11.1 GB / 31.6 GB)
RAM (Apps) : [ OK ] Zajętość: 17% ( 5.2 GB / 31.6 GB)
Zmieniłem również logikę wyzwalania alarmów. Od teraz GuardX aktywuje status ostrzegawczy ([ WARN ] / [ FAIL ]) na podstawie wskaźnika RAM (Apps), a nie RAM (Total). Dzięki temu administrator zyskuje pełną transparentność bufora dyskowego (oznaczonego niebieskim statusem [ INFO ]) i wie dokładnie, ile zasobów faktycznie konsumują uruchomione usługi.
Temperatury dysków: Wsparcie dla SATA i SAS
Co się zmieniło?
Moduł hdtemp_program doczekał się istotnej rozbudowy. Do tej pory ograniczał się on wyłącznie do odczytu temperatur z nowoczesnych nośników NVMe (przy użyciu natywnego narzędzia nvmecontrol). Od tej aktualizacji GuardX skanuje układ /dev/ i automatycznie obsługuje również dyski SSD SATA (ada), SAS/SCSI (da) oraz klasyczne dyski talerzowe (HDD).
Dlaczego to jest ważne?
Serwery rzadko są jednorodne sprzętowo. Często system operacyjny rezyduje na szybkim NVMe, a magazyn danych na pojemnych dyskach HDD lub tańszych SSD SATA. Rozszerzenie modułu pozwala na monitorowanie termiki całej floty dysków z poziomu jednego, lekkiego programu, bez konieczności pisania osobnych reguł dla każdego typu nośnika. Kod inteligentnie rozpoznaje ścieżkę urządzenia i w ułamku sekundy dobiera odpowiedni parser (NVMe log vs S.M.A.R.T. stream), ostrzegając, jeśli którykolwiek nośnik przekroczy bezpieczny próg termiczny.
Zużycie dysków (SMART): Uniwersalna ocena zdrowia
Co się zmieniło?
Równolegle do odczytów temperatury, zaktualizowałem moduł nvmesmart_program (odpowiadający za wskaźnik żywotności komórek pamięci). Nowa wersja wspiera wszystkie główne standardy nośników we FreeBSD.
Jak to działa pod maską?
Dla dysków NVMe program wciąż wykorzystuje bezpośrednie odczyty Percentage Used. Nowością jest analiza atrybutów S.M.A.R.T. (takich jak Media_Wearout_Indicator czy SSD_Life_Left) dla dysków półprzewodnikowych opartych na interfejsach SATA i SAS. Pozwala to na wyliczenie i zaprezentowanie faktycznego zużycia każdego dysku SSD w systemie:
/dev/nvme0 : [ OK ] Zużycie: 2% (Health: 98%)
/dev/ada0 : [ OK ] Zużycie: 1% (Health: 99%)
Co niezwykle istotne, dodałem także mechaniczną asercję dla klasycznych dysków talerzowych (HDD). Dyski mechaniczne nie zużywają komórek pamięci (nie posiadają wskaźnika Wear Leveling). GuardX rozpoznaje takie nośniki w locie – weryfikuje ich globalny status zdrowia sprzętowego (PASSED), po czym degraduje wynik do czytelnego, prostego [ OK ], nie wyświetlając dezinformujących wartości procentowych.
Podsumowanie
Najnowsza modyfikacja sprawia, że GuardX staje się narzędziem w pełni uniwersalnym, gotowym do pracy na zróżnicowanym sprzętowo środowisku FreeBSD. Przeniesienie ciężaru analizy ZFS ARC z zewnętrznych skryptów bezpośrednio na zapytania do jądra C++, oraz ujednolicenie odczytów sprzętowych NVMe/SATA/SAS to kolejny krok w utrzymaniu maksymalnej użyteczności przy zerowym narzucie wydajnościowym na serwer.

