Red Hat (EL) e swap
E’ notizia più o meno recente che nelle Red Hat Enterprise Linux (e derivate) comprese tra la 8.0 e la 8.6 ci sia un bug legato alla gestione della memoria.
Nell’articolo originale (che vi metto tra le risorse) si legge che nei sistemi RHEL 8 based che utilizzano Cgroups v1 si potrebbe verificare una saturazione dello swap anche con memoria ram libera.
Il tutto viene riassunto in:
- Anche se la swappiness=0, la pagecache inattiva viene sostituita invece di essere recuperata.
- Il valore di swappiness (a livello di sistema) specificato in /proc/sys/vm/swappiness ha un effetto minimo o nullo sulle caratteristiche di swap se si utilizza Cgroups V1. Questo discrepanza può portare a un comportamento in sede di valutazione di swap imprevisto e incoerente.
RHEL ha già mitigato la cosa per cui aggiornare è di certo la soluzione migliore. Per non incappare nel bug è sufficiente:
- RHEL 8.7 - kernel-4.18.0-425.3.1.el8.x86_64 o successivo;
- RHEL 8.6.z(EUS) - kernel-4.18.0-372.36.1.el8_6.x86_64 o successivo;
- RHEL 8.4.z(EUS) - kernel-4.18.0-305.76.1.el8_4.x86_64 o successivo.
NB: Le RHEL 9 based non soffrono di questo bug
Se non posso aggiornare?
Se non puoi aggiornare ci sono ben 3 workaround pronti per te.
Numero 1
Una possibile soluzione alternativa per mitigare il problema potrebbe essere l’utilizzo di CgroupV2
# grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"
e poi un bel reboot!
Soluzione B
Se non è vuoi o non puoi migrare a Cgroups V2, una soluzione sarebbe quella di regolare lo swappiness dappertutto.
# for cgfile in $(find /sys/fs/cgroup -name *swappiness); do echo $(cat /proc/sys/vm/swappiness) > $cgfile; done
Red Hat ci tiene a precisare che il comando find non restituisce i file in modo preordinato e consiglia quindi di verificare in che tutti i cgroup esistenti i valori di memory.swappiness che desiderati.
Si potrebbe creare un servizio, che lo esegue durante la fase di boot (After=systemd-sysctl.service).
La terza
E’ possibile impostare il valore di swappiness desiderato nel file /etc/sysctl.conf
vm.swappiness=##
Ora non ti resta che aggiornare il tuo initramfs e riavviare. Red Hat suggerisce di utilizzare
# dracut -f
NB: questa azione imposta lo swappiness predefinito per i cgroup user.slice, init.scope e machine.slice ma non avrà alcun effetto sul cgroup system.slice.
Verifica
Per verificare tutto quanto detto, sintomi e mitigazioni, è possibile lanciare un find
# find /sys/fs/cgroup/memory/ -name memory.swappiness -exec cat {} \;|uniq -c
11 30 <-- sys/fs/cgroup/memory/memory.swappiness
127 60 <-- memory.swappiness under all the .slice/scope
# sysctl -a | grep vm.swappiness
vm.swappiness = 30
Per controllare i Memory Cgroups utilizzati
# grep . /sys/fs/cgroup/memory/*/memory.swappiness
Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.
Risorse: