Skokowy Load Average po restarcie VPS: Jak okiełznać zasobożerne demony (ClamAV)?

Restartujesz serwer VPS, wszystko wstaje poprawnie, ale przez pierwsze 15 minut strony internetowe ładują się w nieskończoność, a konsola ledwo reaguje na wpisywane komendy. Brzmi znajomo? Problemem jest skokowy wzrost wskaźnika Load Average. Najczęstszym winowajcą w środowiskach hostingowych jest oprogramowanie antywirusowe – z naciskiem na popularnego, darmowego ClamAV.

Podczas startu systemu demon ClamAV ładuje do pamięci RAM potężne, ważące setki megabajtów bazy sygnatur wirusów. W tym artykule rozwiążemy ten problem, wdrażając nowoczesne limity zasobów (Cgroups v2) i odpowiednio konfigurując przestrzeń wymiany (SWAP).

Izolacja zasobów: Okiełznanie ClamAV

Zamiast pozwalać antywirusowi na „zjadanie” 100% procesora przy starcie, zamkniemy go w wirtualnej klatce za pomocą menedżera usług Systemd.

Najbezpieczniejszą metodą na nadpisanie domyślnej konfiguracji usługi jest użycie wbudowanego edytora systemowego. Wpisz w terminalu:

sudo systemctl edit clamav-daemon

Otworzy się pusty plik (tzw. drop-in). Wklej w nim poniższe linie dokładnie pomiędzy wyznaczonymi komentarzami:

[Service]
IOSchedulingPriority=7
CPUSchedulingPolicy=idle
CPUQuota=20%
Nice=19
MemoryHigh=1G
MemoryMax=1.5G

Co dokładnie oznaczają te parametry? (Wyjaśnienie):

IOSchedulingPriority=7 i Nice=19 – spychanie procesu na absolutny margines. System operacyjny obsłuży zadania ClamAV tylko wtedy, gdy żaden inny proces (np. Twój serwer WWW) nie będzie niczego potrzebował.

CPUSchedulingPolicy=idle – usługa dostanie czas procesora tylko wtedy, gdy serwer dosłownie „nudzi się” (stan bezczynności).

CPUQuota=20% – twardy kaganiec. Nawet jeśli serwer jest pusty, ClamAV nigdy nie przekroczy 20% użycia jednego rdzenia procesora.

Ważne (Nowość dla Cgroups v2): W starszych poradnikach zalecano przestarzały parametr MemoryLimit=256M. Dziś same bazy wirusów są na to zbyt ciężkie i system ubiłby antywirusa (błąd OOM Killer). Zamiast tego używamy MemoryHigh=1G (miękki limit – system zacznie agresywnie zrzucać pamięć antywirusa na dysk) oraz MemoryMax=1.5G (ostateczny limit bezpieczeństwa).

Zapisz zmiany i zrestartuj demona, aby nowe zasady weszły w życie: 

sudo systemctl daemon-reload
sudo systemctl restart clamav-daemon

Koło ratunkowe, czyli przestrzeń wymiany (SWAP)

Nawet z najlepszymi limitami, małe serwery VPS (np. z 2 GB RAM) mogą dostać zadyszki, gdy usługa próbuje załadować dużo danych. Musimy stworzyć tzw. SWAP – plik na dysku twardym, który udaje pamięć RAM. Jest on znacznie wolniejszy, ale ratuje serwer przed zawieszeniem.

Zalecam utworzenie pliku wymiany o wielkości równej ilości Twojego RAM-u. Użyjemy do tego polecenia dd (jest bezpieczniejsze niż szybsze fallocate, które potrafi sprawiać problemy na nowoczesnych systemach plików jak Btrfs czy ZFS):

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Gdzie count=2048 oznacza 2 GB (2048 Megabajtów).

Aby SWAP włączał się sam po każdym restarcie, musimy dopisać go do tabeli partycji:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Prawda o parametrze „Swappiness” w nowoczesnym Linuxie

W wielu starszych poradnikach przeczytasz, że modyfikacja parametru vm.swappiness kontroluje procent zajętości RAM-u, przy którym system zaczyna zrzucać dane na dysk. W nowoczesnych systemach (jądra z serii 6.x) jest to mit.

Obecnie jądro Linuxa używa zaawansowanego algorytmu, a parametr swappiness to po prostu „waga” w decydowaniu, co usunąć z przepełnionego RAM-u. Domyślna wartość to 60.

Zmniejszając tę wartość (np. do 10), mówisz systemowi: „Nie wyrzucaj na dysk uśpionych aplikacji, lepiej skasuj z RAM-u zbuforowane pliki”.

Jeśli zjedziesz do 0, system zacznie zabijać procesy, zanim użyje SWAPu.

sudo sysctl vm.swappiness=10

Aby zmiana przetrwała restart, dodaj ją do konfiguracji:

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

Podsumowanie

Wysoki Load Average po restarcie to nie wada serwera VPS, lecz wynik walki potężnych usług o ograniczone zasoby w pierwszych sekundach działania. Wdrażając nowoczesne limity cgroups (systemctl edit) oraz zapewniając bufor bezpieczeństwa w postaci SWAP-u, sprawisz, że Twój serwer będzie uruchamiał się płynnie, a usługi takie jak WWW czy poczta będą działać błyskawicznie, podczas gdy „ciężkie demony” spokojnie załadują się w tle.

Artykuł pierwotnie opublikowany na stronie botset.pl dnia 29.07.2021 roku. Tekst został poddany gruntownej aktualizacji – dostosowano limity RAM do współczesnych wymagań oprogramowania, wprowadzono nowoczesną składnię limitów Systemd (cgroups v2) oraz wyjaśniono mechanikę MGLRU dla parametru swappiness w najnowszych wersjach jądra Linux.