Prestazioni di Linux: Perché dovresti quasi sempre aggiungere spazio di swap
Sappiamo che usare lo spazio di swap di Linux al posto della RAM (memoria) può rallentare gravemente le prestazioni. Quindi, ci si potrebbe chiedere, visto che ho più che abbastanza memoria disponibile, non sarebbe meglio eliminare lo spazio di swap? La risposta breve è: No. Ci sono vantaggi in termini di prestazioni quando lo spazio di swap è abilitato, anche quando si ha abbastanza memoria. Aggiornamento, vedi anche Parte 2: Prestazioni di Linux: Aggiungere quasi sempre swap (ZRAM).
Anche con una più che adeguata memoria server installata, troverete spesso che lo spazio di swap sarà utilizzato dopo lunghi periodi di attività. Vedi l’esempio qui sotto da un server live-chat con circa un mese di uptime:
total used free shared buff/cache availableMem: 3.7G 1.0G 445M 84M 2.2G 2.2GSwap: 1.8G 308M 1.5G
L’output di free -h
qui mostra 308M di spazio swap utilizzato. Quando ho eseguito i controlli per lo swapping, non c’erano segni di attività di swap I/O in corso o intempestiva. Inoltre, il servizio kswap non ha consumato molto tempo di CPU. Infatti, il processo kswap non si trovava da nessuna parte in top (processi top ordinati per tempo di CPU). Per confermare, ho usato il seguente comando:
ps -A | grep kswap 40 ? 00:00:29 kswapd0
…quindi in questo caso, come in molti, l’uso dello swap non sta danneggiando le prestazioni del server Linux. Ora, vediamo come lo spazio di swap può effettivamente aiutare le prestazioni del server Linux.
Aggiornamento: Recentemente ho installato Manjoro i3 sul mio Pinebook Pro. Ora ha la ZRAM abilitata di default.
Svantaggi dello spazio di swap su sistemi con adeguata RAM
È normale e può essere una buona cosa per i sistemi Linux usare un po’ di swap, anche se c’è ancora RAM disponibile. Il kernel Linux sposterà le pagine di memoria che non sono quasi mai utilizzate nello spazio di swap per garantire che ancora più spazio cachabile sia reso disponibile in-memoria per le pagine di memoria utilizzate più frequentemente (una pagina è un pezzo di memoria). L’uso dello swap diventa un problema di prestazioni quando il kernel è sotto pressione per spostare continuamente le pagine di memoria dentro e fuori dalla memoria e dallo spazio di swap.
Un altro vantaggio è che lo swap dà agli amministratori il tempo di reagire ai problemi di bassa memoria. Spesso noteremo che il server si comporta lentamente e, al momento del login, noteremo un pesante swapping. Senza swap (come descritto nella prossima sezione), esaurire la memoria può creare reazioni a catena molto più improvvise e gravi. Quindi di solito, consiglierei di impostare lo spazio di swap a circa la dimensione del vostro processo più grande. Per esempio, la memoria configurata di MySQL in my.cnf. Può anche essere più piccolo, specialmente se avete il monitoraggio e/o gli avvisi in atto.
Alcuni raccomandano di non avere swap o di avere una dimensione di swap leggermente più grande della RAM totale. Se puoi trovare delle ragioni valide per questo, allora questa potrebbe essere la tua scelta. Tuttavia, questo è difficilmente il caso sui server, e dovreste invece bilanciare la vostra decisione con gli effetti che lo swap avrà sulle vostre specifiche applicazioni. Lo swap non cambia la quantità di RAM richiesta per un server sano, o per un desktop per quella materia. È progettato per essere complementare alle prestazioni di sistemi sani.
Per riassumere:
– Anche se c’è ancora RAM disponibile, il kernel di Linux sposterà le pagine di memoria che non sono quasi mai utilizzate nello spazio di swap.
– È meglio scambiare le pagine di memoria che sono state inattive per un po’, mantenendo i dati usati spesso nella cache, e questo dovrebbe avvenire quando il server è più inattivo, che è lo scopo del kernel.
– Evita di impostare il tuo spazio di swap troppo grande se questo porterà a prolungare i problemi di prestazioni, interruzioni, o il tuo tempo di risposta (senza un adeguato monitoraggio/avvisi).
Swap Space vs. No Swap quando la memoria disponibile è bassa
A differenza del caso precedente, se non hai abbastanza memoria, lo swap sarà usato abbastanza spesso e notevolmente di più durante qualsiasi picco di richiesta di memoria. Se non avete abbastanza memoria e nessuno spazio di swap, questo causerà spesso la mancata allocazione della memoria per le richieste che necessitano di più pagine di memoria. Come ultima risorsa, il Kernel impiegherà OOM killer per eliminare i processi ad alta memoria (di solito MySQL, java, ecc.).
Per uno sguardo più dettagliato allo spazio di swap di Linux, leggete i capitoli Swap Management e Page Frame Reclamation dai documenti di Kernel.org. Inoltre, guardate l’ultima sezione, “Pressione della cache del kernel e swappiness”, del mio altro post sul blog per suggerimenti su come regolare l’uso dello spazio di swap di Linux da parte del kernel. Se il tuo spazio di swap “usato” è sempre ‘0’, allora hai davvero una tonnellata di RAM liberamente disponibile, nel qual caso può essere sicuro rimuovere lo spazio di swap… o puoi regolare la pressione della cache del kernel per fare uso di ancora più RAM.
Per riassumere:
– Lo swap I/O scala molto male. Se le pagine di memoria non possono essere scambiate solo quando il server è inattivo, si dovrebbe sintonizzare o disabilitare lo swap. Questo di solito non è il caso, quindi il titolo “quasi sempre” di questo post sul blog.
– Con lo swap disabilitato, i problemi di prestazioni diventano evidenti molto velocemente, e il killer OOM potrebbe prendervi! 🙂
Per confronto, ecco l’output di free usando una vecchia versione di free da procps-ng-3.3.1 sullo stesso server:
total used free shared buffers cachedMem: 3.7G 3.3G 445M 0B 4.2M 1.7G-/+ buffers/cache: 1.6G 2.1GSwap: 1.8G 308M 1.5G
Pressione della cache del kernel e swappiness
Ora che avete swap abilitato. Considerate di regolare la pressione della cache del vostro server e la tendenza allo swap (vm.swappiness) seguendo la guida qui sotto, che è tratta dall’articolo precedente: Il server Linux ha bisogno di un aggiornamento della RAM? Controllate con top, free, vmstat e sar:
vfs_cache_pressure – Controlla la tendenza del kernel a recuperare la memoria, che è usata per la cache degli oggetti directory e inode. (default = 100, valore consigliato da 50 a 200)
swappiness – Questo controllo è usato per definire quanto aggressivo il kernel scambierà le pagine di memoria. Valori più alti aumenteranno l’aggressività; valori più bassi diminuiranno la quantità di swap. (default = 60, valori raccomandati tra 1 e 60) Rimuovere lo swap per il valore 0, ma di solito non è raccomandato nella maggior parte dei casi.
Per modificare, è possibile aggiungere o sostituire queste linee nel file /etc/sysctl.conf. Per esempio, se avete poca memoria fino all’aggiornamento, potete provare qualcosa come:
vm.swappiness=10vm.vfs_cache_pressure=200
Questo aumenterà la pressione della cache, il che può sembrare un po’ controproducente dato che la cache è buona per le prestazioni. Tuttavia, uno swapping troppo frequente riduce molto di più le prestazioni complessive del vostro server. Quindi non tenere tanta cache in memoria aiuterà a ridurre l’attività di swap. Inoltre, con vm.swappiness impostato a 10 o al minimo di 1, si ridurrà lo swapping del disco.
Su un server sano con molta memoria disponibile, usate quanto segue:
vm.swappiness=10vm.vfs_cache_pressure=50
Questo diminuirà la pressione della cache. Poiché la cache è un bene per le prestazioni, vogliamo mantenere i dati nella cache più a lungo in memoria. Since the cache will grow larger, we still want to reduce swapping to not cause increased swap I/O.
To check current values using these commands use:
sudo cat /proc/sys/vm/swappinesssudo cat /proc/sys/vm/vfs_cache_pressure
To enable these settings temporarily without rebooting, use the following commands:
sudo sysctl -w vm.swappiness=10sudo sysctl -w vm.vfs_cache_pressure=50