Se vuoi iniziare una discussione con un utente Linux, chiedi informazioni su swap memoria. Alcuni lo lodano come un cuscino o come una rete di sicurezza, mentre altri lo denigrano come una stampella e un distruttore delle prestazioni del sistema. Nata negli anni '60, la memoria di scambio si è evoluta nel corso degli anni su Linux per svolgere due funzioni essenziali:
- Memoria di emergenza quando un sistema consuma tutta la sua RAM e ne necessita ancora di più
- Un parcheggio per pagine di memoria usate raramente che occupano preziosa RAM di sistema
Molte distribuzioni Linux, incluso Red Hat, consigliano la memoria di scambio per tutti i sistemi. Tuttavia, se guardi la maggior parte delle istanze cloud di varie distribuzioni, scopri che la memoria di scambio è assente.
[ Potrebbe piacerti anche: Risoluzione dei problemi di Linux 101:prestazioni del sistema ]
Panoramica dello scambio
Swap esiste sulla maggior parte dei sistemi come partizione su un disco. Dopo il partizionamento, gli amministratori formattano la partizione con mkswap
, abilitalo con swapon
e il kernel vede immediatamente la memoria di swap disponibile. I sistemi senza una partizione disponibile possono utilizzare un file di scambio, che è solo un file su un filesystem esistente formattato con mkswap
e abilitato.
Entrambi i metodi funzionano bene, ma inserire uno scambio su una partizione porta a prestazioni migliori poiché si salta l'overhead di un file di scambio su una partizione esistente.
Quando la RAM di sistema è scarsa, Linux può archiviare le pagine di memoria nello scambio per evitare di interrompere i processi e di mandare in crash il sistema. I dischi sono molto più lenti della RAM di sistema e questo riduce le prestazioni del sistema fino a quando la RAM di sistema non si libera. Se l'utilizzo della memoria continua a salire fino al punto in cui la RAM di sistema e lo swap sono completamente esauriti, viene visualizzato il killer di memoria insufficiente (OOM) che inizia a terminare i processi finché non diventa disponibile RAM sufficiente.
Il consiglio di vecchia data sulla dimensione dello scambio è il doppio della dimensione della RAM del tuo sistema. Ad esempio, alloca 2 GB di swap per sistemi con 1 GB di RAM di sistema. Sebbene questo rapporto funzioni bene per i sistemi più piccoli, non aumenta per i sistemi con centinaia di gigabyte di RAM di sistema.
Il caso dello scambio su cloud
L'ascesa dei microservizi (piccoli servizi interconnessi che formano una grande applicazione) ha portato le aziende a distribuire un numero maggiore di istanze più piccole. Le istanze più piccole hanno meno RAM di sistema, il che aumenta il rischio che il temuto killer OOM si presenti per interrompere i processi finché il sistema non ha abbastanza memoria libera.
L'aggiunta di swap a questi sistemi aiuta in due modi:
- In primo luogo, i processi possono esplodere brevemente dalla RAM di sistema in uno scambio durante i periodi di carico elevato. Gli amministratori vengono a conoscenza di questi eventi dai loro sistemi di monitoraggio e hanno il tempo di indagare sul motivo dell'esplosione mentre si verifica nel sistema. In caso di perdite di memoria, gli sviluppatori possono ispezionare il processo per capire cosa è andato storto mentre è ancora vivo. Questo può anche essere un segnale che gli amministratori necessitano di tipi di istanza più grandi per la loro applicazione man mano che cresce.
- In secondo luogo, il kernel Linux controlla le pagine di memoria usate raramente e le invia per scambiare per preservare la preziosa RAM di sistema. Il
sysctl
impostandovm.swappiness
controlla il desiderio del kernel di spingere le pagine di memoria per lo scambio. Ciò potrebbe aiutare un'istanza cloud mantenendo le pagine più attive nella RAM di sistema mentre espelle le pagine utilizzate raramente per scambiare la memoria.
Il caso contro lo swap su cloud
L'analogia "animali domestici vs bestiame" si presenta frequentemente quando si parla di istanze cloud e gli amministratori vietano lo scambio poiché possono sostituire automaticamente un'istanza che si comporta in modo anomalo con una nuova. Nel tempo, le loro metriche di monitoraggio mostrano un aumento delle istanze che necessitano di sostituzione a causa del killer OOM che porta offline la loro applicazione. La soluzione potrebbe essere istanze più grandi o ulteriori indagini sulle perdite di memoria sotto carico. Systemd
riavvierà anche questi processi rapidamente quando possibile.
La scelta di una posizione di memoria di scambio sulle istanze cloud richiede più riflessione e pianificazione. Sui server fisici, lo scambio su un disco NVMe (Non-Volatile Memory Express) collegato localmente è abbastanza veloce, ma che dire di un'istanza cloud con storage esterno montato, come l'Elastic Block Storage (EBS) di AWS? Le prestazioni su EBS variano a seconda del tipo di EBS scelto e dei tuoi vicini sul sistema. Lo scambio su un sistema di archiviazione remoto potrebbe portare a scarse prestazioni dell'istanza quando il sistema sovraccarica la propria RAM. Gli amministratori possono scegliere di omettere lo scambio e sostituire queste istanze quando sovraccaricano la loro RAM invece di lottare con richieste di gestione del server con prestazioni scadenti.
Infine, molte istanze cloud diventano parte dei cluster Kubernetes e OpenShift e devono affrontare una sfida quando si tratta di memoria di scambio. C'è un problema di GitHub di lunga data sulla gestione della memoria di scambio in modo appropriato poiché elimina la contabilità della memoria per i contenitori. Esistono soluzioni alternative, ma la memoria di scambio generalmente viene ignorata su questi sistemi.
Distribuzione di istanze cloud con swap
Se dovessi decidere che il provisioning della memoria di swap avvantaggia le tue applicazioni, cloud-init ti dà la possibilità di effettuare il provisioning della memoria di swap al primo avvio utilizzando i mounts
modulo. Basta aggiungere alcune righe ai dati utente di configurazione cloud esistenti:
swap:
filename: /swapfile
size: auto
maxsize: 4294967296
Questa configurazione indica a cloud-init di creare un file di scambio in /swapfile
con una dimensione automatica uguale o inferiore a 4GB. La formula per il dimensionamento automatico dello scambio è nel codice sorgente di cloud-init:
formulas = [
# < 1G: swap = double memory
(1 * GB, lambda x: x * 2),
# < 2G: swap = 2G
(2 * GB, lambda x: 2 * GB),
# < 4G: swap = memory
(4 * GB, lambda x: x),
# < 16G: 4G
(16 * GB, lambda x: 4 * GB),
# < 64G: 1/2 M up to max
(64 * GB, lambda x: x / 2),
]
Le dimensioni di scambio consigliate da Red Hat differiscono leggermente:
- 2 GB o meno di RAM di sistema :2x RAM
- Da 2 GB a 8 GB : 1x RAM
- Da 8 GB a 64 GB : 4 GB minimo
- Più di 64 GB : 4 GB minimo
Puoi specificare manualmente la memoria di scambio (in byte) con la size:
parametro
nel cloud-config:
swap:
filename: /swapfile
size: 2147483648 # 2 GiB
Provisioning swap su un'istanza cloud esistente
Per le istanze esistenti, un file di scambio è spesso il metodo più semplice per abilitare la memoria di scambio. In questo esempio, inserisci un file di scambio da 2 GB in /swapfile
:
# BTRFS only #################################################################
# We must disable copy-on-write updates for swap files on btrfs file systems.
# The 'swapon' step fails if you skip these steps.
truncate -s 0 /swapfile
chattr +C /swapfile
# BTRFS only #################################################################
# A 2 GiB swap file.
dd if=/dev/zero of=/swapfile bs=1MiB count=2048
# Set the correct permissions on the swap file.
chmod 0600 /swapfile
# Format the swapfile.
mkswap /swapfile
# Enable the swapfile.
swapon /swapfile
# Add it to /etc/fstab to enable it after reboot.
echo "/swapfile none swap defaults 0 0" >> /etc/fstab
Controlla se la tua memoria di scambio è pronta:
$ cat /proc/swaps
Filename Type Size Used Priority
/swapfile file 2097148 0 -2
[ Corso online gratuito:panoramica tecnica di Red Hat Enterprise Linux. ]
Concludi
La memoria di scambio offre due preziosi vantaggi:
- Un cuscino di sicurezza quando l'utilizzo della RAM di sistema aumenta a livelli pericolosi
- Un parcheggio per le pagine di memoria usate raramente che occupano spazio prezioso nella RAM di sistema
Quel cuscinetto di sicurezza comporta una riduzione delle prestazioni poiché il paging della memoria sui dischi è incredibilmente lento rispetto alla memoria di sistema.
Le distribuzioni cloud vedono raramente la memoria di scambio distribuita, ma lo scambio ha comunque dei vantaggi. La scelta di distribuire lo scambio consente una protezione di sicurezza quando le applicazioni si comportano in modo anomalo, ma potrebbe causare un rallentamento delle prestazioni di un'applicazione fino a quando i problemi di consumo di memoria non vengono risolti. Saltare lo scambio rimuove il cuscino ma assicura che un'applicazione che si comporta in modo anomalo si interrompa immediatamente. Gli amministratori cloud devono disporre di un piano in atto per gestire queste situazioni.
Fortunatamente, cloud-init appare nella stragrande maggioranza delle istanze cloud e consente la creazione di file di scambio con solo poche righe di YAML. La memoria di scambio è anche facile da configurare dopo la distribuzione utilizzando semplici comandi o script della shell.
Sia che tu scelga di distribuire la memoria di scambio o di farne a meno, assicurati di avere un piano quando succede il peggio. Monitora i sistemi in modo appropriato e mantieni una visione olistica dell'applicazione che servono.