Marvin Pascale

[B.Log]

17 Maggio 2023

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: