SWAP ovvero l’aerea di scambio memoria

L’area di swap è una zona del disco che archivia la memoria-RAM (memoria del PC per elaborare i programmi) quando questa diventa piena o deve essere riorganizzata o per scaricarla di parti inutili. Serve anche per parcheggiare la memoria RAM in varie altre operazioni come Ibernazione e Sospensione o ri-gestirla o come zona di sicurezza, ri-mappatura indici disco, ecc. ecc..

Spiegazione della Swap

Nota: Per trattarla tutta ci vorrebbe un libro qui lo spiego brevemente.

Linux/Unix (ed altri) usano una vera zona del disco meglio detta Partizione-Swap. Lo spazio viene anche usato per memorizzare informazioni hardware da parte di Linux, per questo si consiglia di avere uno swap per ogni disco fisico e di aumentare lo spazio swap di qualche migliaio di byte in più della memoria. Tenete conto che se “ibernate su disco” voi spostate TUTTA l’informazione dalla RAM nella Swap, più le informazioni di recupero e altro nella Swap. Ci sono database (vedi Oracle) che usano direttamente l’area di swap per la loro cache. Ecc. Ecc. Ecc.

Insomma lo swap serve per una marea di cose come potete vedere dall’immagine reale su una macchina con 4GiB (veramente 3,55) di RAM anche se si usa nemmeno 1 GiB per tutti i programmi.

Nota: Alcuni dicono che l’area di swap non serva è perchè sono ignoranti di cosa serva e la cosa è qui evidente, quindi vi consiglio non seguite nessun suggerimento da queste persone!

Nota: se non vi è chiara questa spiegazione qui un altra semplice: https://www.dragas.net/posts/lo-swap-e-la-memoria-virtuale/

Nota: Si consiglia in caso di server di avere più partizioni-swap su più dischi (o un disco specifico ad alta velocità) anche per avere la lettura/scrittura parallela con il minimo di concorrenza. Certo questo se avete problemi di velocità in caso di carichi eccezionali della macchina!

Sia il file-swap che la partizione-swap usano il file-system-Swap, ovvero è un vero è proprio FileSystem!

Windows usa i file-swap su NTFS, ovvero in c:\windows\ esiste un file o più files (il nome dipende dalle versioni come anche la vera posizione) che fanno la stessa cosa delle partizioni-swap.

Il vantaggio di avere una partizione-swap, invece di un file-swap, consiste che avendo una zona disco con un filesystem dedicato, questo è 1000 volte più veloce che scriverlo su un file in un file-system (come NTFS o WIN-FS, ma anche EXT4, ecc.) che è sostanzialmente “generico” e in concorrenza con la gestione di altri file.

Del resto quando la velocità è tutto anche i database e altri programmi si spostano su Partizioni e non stanno su file!

È una Balla (indovinate chi la diffonde, dato che deve VENDERE un OS scadente?) che i nuovi filesystem siano più veloci di una partizione Swap (che poi è formattata “swap”, evviva la monotonia); Vero che possono fare più cose ma tutte queste sono inutili per fare lo swap. Falso che partizionando si rovini il disco, del resto sono pochi byte di scrittura. Vero che ci voglia la continuità tra settori ma chi non fa sistemi Real-Time non conosce questi aspetti.

Anzi quando Windows si “impianta” e attiva lo scandisk automatico di solito è perchè il file-swap si è rovinato oppure che riempie tutto! Avrete invece solo un errore in Linux e la sicurezza che non si è rovinato nient’altro!

In un certo senso se uno usa Linux per “desktop” senza tanto spremerlo sembrano uguali in quanto prestazioni dato che ci sono diverse cache e tempi morti, ma io adesso avrei Netben + Eclipse + Amarok e vari altri (già fatti fuori i miei giga di RAM più volte!!!) e non si affatica.

Dire che il meglio è aumentare la memoria o CPU se non addirittura cambiare la macchina con un computer più potente non risolve se VOI per primo non ottimizzate un computer: Finirete (lo so per esperienza) con avere gli stessi problemi poi con 100Giga di RAM e CPU spaziali! Logico che se è ottimizzato dovete metter mano al portafogli..

Un guaio dei file-swap è che necessitano di un modulo apposito (dal kernel-Linux 2.6 è integrato) dato che questo file è un filesystem e questo limita la ricollocazione del FS stesso! Per questo non funzionano i file-swap su alcuni FS come BTRFS dato che sono FS che ricalcolano e ri-allocano i file.

Lo svantaggio della partizione-swap, consiste nel fatto che di norma deve essere più grande della memoria RAM (swap=quantità_RAM+10%) e questa zona disco è sottratta per sempre dalla possibilità di scrivere dati. Capita di aumentare la RAM o succede che (rarissimo ma accade) richiede più spazio di quella calcolata come standard: Quindi se la partizione-swap deve essere aumentata e non è una cosa facile.

Nota: Red-Hat (ma anche la sua versione “desktop” Fedora) consigliano che l’area di Swap sia addirittura 1,5 volte se non 2 volte la Memoria RAM. Questa raccomandazione è presente anche per altre distribuzioni.

Nel caso che l’area di swap viene riempita: Rallenta (caso OpenSuse) e rifiuta i nuovi programmi (ma può impallarsi o meglio rallentare paurosamente) oppure in casi eccezionali dare errore e segare le richieste successive. Cose ovviamente non piacevoli!

Nota: Non è tanto il Kernel Linux (anzi può far ad meno dello Swap) ma altri programmi che accedono (vedi RDBMS Oracle) su quell’area che fanno casino.
Linux possiede però un trucco: Posso avere sia lo SWAP su partizione (che poi è lo standard) che, o anche, su file!

Per assurdo se noi usiamo ambedue abbiamo una velocizzazione: Se è occupata la partizione-swap non aspetterà che questa si liberi, ma userà il file-swap da noi creato.
Riassumendo: Usare una doppia area SWAP sia in partizione (standard) che in file, consente di risparmiare disco (poco per la verità) e nei casi estremi velocizzare il PC, ma soprattutto essere finalmente stra-sicuri che non accada un “Error full Swap”.

Usare invece solo un file-swap, rallenterete solo il sistema ma lo vedrete in caso di un uso “pesante” al che, accade più spesso e dove non penserete mai che accada.

Serve anche perchè in questo modo se aumentate la RAM basterà aumentare lo swap-file invece del complicato swap-partizione.
Nota: da http://www.cyberciti.biz/faq/linux-add-a-swap-file-howto/ e https://wiki.archlinux.org/index.php/Swap_%28Italiano%29 adattati.

Nota: Controllare di possedere un Linux-Kernel successivo al 2.6 e installare tutto il pack di amministratore

Attenzione: Il file di swap non può essere montato su BTRFS salvo usare un modulo apposito (oppure usare trucchetti) che sinceramente non consiglio ancora!

Attenzione: Non consiglio di metterlo sulla partizione Home! È l’ultima partizione che si monta e può dare problemi di permessi.

Attenzione: Non metterlo in Filesystem che non siano nativi Linux! (esempio non NTFS)

 

Procedura Per aggiungere un file di swap in Linux

 

1: accedere come utente root

Accedete come utente root, se non sapete come fare è inutile che continuate!!!

Questa è roba da esperti e io stesso sconsiglio se non si è più che capaci e come al solito nego ogni responsabilità.

 

2: Crea file di archiviazione

Digitare il seguente comando per creare il file (che sarà di swap) da 512 MB (formato 1024 * 512 = 524288 blocchi):

dd if=/dev/zero of=/swapfile1 bs=1024 count=524288

Risponde:

524288+0 records in
524288+0 records out
536870912 bytes (537 MB) copied, 3.23347 s, 166 MB/s

 

Spiegazione:

“/swapfile1” è il nostro file chiamato swapfile1 e (il “/”) messo sotto root .

“if=/dev/zero” : Leggi dal file speciale zero. Zero è un file speciale che fornisce solo caratteri nulli per creare il nostro file di archiviazione chiamato /swapfile1.

“of=/swapfile1”: Leggi dal file di zero la scrittura e riporta a /swapfile1.

“bs=1024”: Leggere e scrivere con 1024 byte alla volta.

“count=524288”: Copiare solo 523.288 BLOCCHI.

 

Ovvio che se volete di più, il valore di bs e count vanno rapportati alla grandezza che volete ma sempre allineati. Esempio se volete 1GB di area swap dovete fare bs=2048 count=1048576

Inoltre:

dd if =/dev/zero of=/swapfile1 bs=1024 count=524288

È possibile trasformarlo (uguale) in:

dd if =/dev/zero of=/swapfile1 bs=1M count=512

Nota: Conviene che ogni blocco sia di base 512MB, dunque è conveniente avere un file-swap che non è meno di 512MB.

Nota: Per ragioni storiche un file-swap viene creato sempre alla radice (“/”) di un disco, ma l’altra posizione standard è /opt .

 

3: Un file SWAP sicuro

Per motivi di sicurezza, impostare i corretti permessi del file:

chown root:root /swapfile1

chmod 0600 /swapfile1

Nota: I comandi di cui sopra si assicurano solo utente root può leggere e scrivere il file o poterlo cancellare.

Nota. Dato che ci siete, controllate che nessun programma controlli (o peggio guardi dentro) quel file-swap come ad esempio un programma d’indicizzazione.

 

4: Formattare l’area di swap Linux

Digitare il seguente comando per formattare una zona di swap Linux nel file:

mkswap /swapfile1

 

Risposta:

Setting up swapspace version 1, size = 524284 KiB
no label, UUID=0e5e7c60-bbba-4089-a76c-2bb29c0f0839

 

Nota: Qui abbiamo solo formattato lo swap dentro il file ma questo non è attivo per il PC.

 

5: Attivazione del file di swap

Infine, attivare lo spazio di swap nell’esempio “swapfile1”:

swapon /swapfile1

 

6: Aggiornamento file / etc / fstab

Per attivare sempre /swapfile1 dopo il riavvio del sistema Linux, aggiungere la voce al file

/etc/fstab

Prima però abbiamo bisogno di una informazione, il suo UUID (un identificativo univoco). Questo possiamo prenderlo dal Yast -> Partizionatore, oppure dato che è montato basta dare il comando

blkid

risponderà (esempio) una lista con righe come questa (si nota che è l’ultima)

/dev/sda1: LABEL="PQSERVICE" UUID="9A86888B86886999" TYPE="ntfs" PARTUUID="7fb25862-01"
/dev/sda2: LABEL="SYSTEM RESERVED" UUID="705289105288DBEA" TYPE="ntfs" PARTUUID="7fb25862-02"
/dev/sda3: LABEL="Acer" UUID="48788A20788A0CBE" TYPE="ntfs" PARTUUID="7fb25862-03"
/dev/sda5: UUID="2ee8294e-45d3-4350-86ae-717f6602bae1" UUID_SUB="a8b9c119-9543a74ee" TYPE="btrfs" PARTUUID="7fb25862-05"
/dev/sda6: UUID="7cea328a-4fa9-4724-883e-778e5945cf7a" TYPE="xfs" PARTUUID="7fb25862-06"
/dev/sda7: UUID="408f3eba-2ce6-4429-95e6-a465489a096f" TYPE="swap" PARTUUID="7fb25862-07"
/swapfile1: UUID="7d423ba2-96bf-4493-acf9-ed22e897eed5" TYPE="swap" PARTUUID="7fb25862-08"

Aprire il file con un editor di testo. Qui per esempio si usa editor di testo vi (consiglio il tools mc che possiede l’editor mceditor), ma potete usare altro:

vi /etc/fstab

Aggiungete la seguente riga al file fstab:

UUID=7d423ba2-96bf-4493-acf9-ed22e897eed5 /swapfile1 swap sw 0 0

Nota: Il vecchio sistema era =/swapfile1 none swap sw 0 0

Logico che ricopierete la UUID corretta e il nome corretto, per maggiori informazioni

https://wiki.archlinux.org/index.php/Fstab_(Italiano)

(in inglese) https://en.opensuse.org/SDB:Mount_additional_disk e per la UUID https://liquidat.wordpress.com/2013/03/13/uuids-and-linux-everything-you-ever-need-to-know/

Salvare e chiudere il file.

Troppo difficile? Leggetevi come fare digitando da terminale

man systemd.swap

 

7: Fatto

Fatto!

Nota: Non consiglio d’usare i comandi:

swapoff -a
swapon -a

Per fermare e riattivare gli swap invece di riavviare il PC, ma è comodo se volete fare un debug.

DOMANDE :

 -Come faccio a verificare se lo swap è attivato o no?

 

Basta usare il comando free:

 

free -m

 

Risposta:

             total       used       free     shared    buffers     cached
Mem:          1876       1798         77          0        119       1440
-/+ buffers/cache:        237       1638
Swap:         4607          0       4607

 

 

-Come è possibile visualizzare il riepilogo dell’utilizzo su Linux?

 

Digitare il comando swapon seguente:

 

swapon -s

 

Risponde:

 

Filename                 Type            Size    Used    Priority
/dev/sda6                partition       4194296 0       0
/swapfile1               file            524280  0       -1

 

Nota: Qui, da “Priority”, vediamo che prima userà la partizione (SDA6) e se questa è piena/occupata userà il file-swap “swapfile1” da noi creato. Infatti priorità 0 è maggiore di -1. Il bello è che prima era SDA6 (quando era da solo) ad avere priorità=-1.

 

Un’altra opzione è quella di visualizzare file /proc/meminfo:

 

less /proc/meminfo | grep -i –color swap /proc/meminfo

 

Risponde:

 

SwapCached:        30748 kB
SwapTotal:       6291448 kB
SwapFree:        6154008 kB

 

 

È inoltre possibile utilizzare il comando top, atop o htop per visualizzare le informazioni sull’utilizzo dello swap:

 

Uscite di esempio da un server di database in esecuzione su un server CentOS Linux:

 1  [||                        3.9%]     Tasks: 171, 106 thr; 1 running
  2  [                          0.0%]     Load average: 0.06 0.12 0.09
  3  [||                        2.0%]     Uptime: 22 days, 07:07:28
  4  [                          0.0%]
  5  [                          0.0%]
  6  [                          0.0%]
  7  [                          0.0%]
  8  [                          0.0%]
  Mem[||||||||||||||||||2112/11909MB]
  Swp[|                   134/6143MB]
  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 8523 mysql      20   0 4545M  414M  4816 S  0.0  3.5  0:00.00 /usr/libexec/mysq
 8524 mysql      20   0 4545M  414M  4816 S  0.0  3.5  0:02.74 /usr/libexec/mysq
 8525 mysql      20   0 4545M  414M  4816 S  0.0  3.5  0:16.17 /usr/libexec/mysq
 8526 mysql      20   0 4545M  414M  4816 S  0.0  3.5  0:06.33 /usr/libexec/mysq
 8528 mysql      20   0 4545M  414M  4816 S  0.0  3.5  4:02.14 /usr/libexec/mysq
 8529 mysql      20   0 4545M  414M  4816 S  0.0  3.5  5:22.00 /usr/libexec/mysq
 8530 mysql      20   0 4545M  414M  4816 S  0.0  3.5  0:04.63 /usr/libexec/mysq
 8531 mysql      20   0 4545M  414M  4816 S  0.0  3.5  0:50.95 /usr/libexec/mysq
 8532 mysql      20   0 4545M  414M  4816 S  0.0  3.5  0:08.10 /usr/libexec/mysq
 9359 mysql      20   0 4545M  414M  4816 S  0.0  3.5 22:53.28 /usr/libexec/mysq

 

-Come è possibile disattivare i dispositivi e i file per la paginazione e swap su Linux?

 

È necessario utilizzare il comando swapoff:

swapoff /swapfile1

swapon -s

 

-Come faccio a impostare swappiness su un server Linux?

 

La sintassi è:

 

sysctl vm.swappiness=VALUE

sysctl vm.swappiness=20

 

Il valore (predefinito 60) dei controlli di file /proc/sys/vm/swappiness si basa sulla “aggressività” del kernel di scambiare pagine di memoria. Valori più alti aumentano aggressività e viceversa. Per apportare modifiche permanenti aggiungere la seguente riga a /etc/sysctl.conf:

 

vm.swappiness = 30

 

-Impostare priorità di swap

Il Swapiness è la priorità di ingresso / uscita per lo swap.

Il valore corrente (standard 60) è in:
cat /proc/sys/vm/swappiness

Per modificare la priorità di swap ovvero il valore più basso significa meno azioni di swap:
sysctl vm.swappiness = 10

Per avere questo valore impostato all’avvio dovete aggiungerlo al /etc/sysctl.conf come
vm.swappiness = 0

 

-Modificare la grandezza o cancellare il file-swap

Prima controllare che ci sia una zona swap attiva OLTRE quella da modificare/cancellare.

Fai clic per controllare che il file di swap non è attivo oppure se è solitario
swapon -s

 

-Se è attivo e non è solitario.

swapoff /swapfile1
Commentate la riga nel file /etc/fstab (asta posizionare un # iniziale o semplicemente cancellare la linea) come avete fatto (al contrario) nel punto 6.
Adesso rimuovere il file di swap anche con un semplice:

rm -rf /swapfile1

 

Se volevate cancellarlo adesso basta riavviare.

Se volevate modificarlo lo ricreate come volete e poi riavviate.

 

-Fare più files di file-swap

Non è possibile o per lo meno si potrebbe fare solo se si controlla che siano contigui sul disco, e anche non ricollocabili dal Filesystem e trattarli sempre come una entità unica con nome con numero progressivo, ovvero se modifichi uno devi modificare tutti e se cancelli uno devi cancellare tutti, ecc…..

Questa soluzione è poi più lenta di avere un unico file di swap!

Dunque diciamo che non è possibile.

 

-Partizione dello swap fisiche

Una partizione dello swap può essere creata con la maggior parte dei programmi di gestioni delle partizioni (ad es. fdisk, cfdisk).

Queste partizioni hanno (e devono) come numero identificativo 82.

 

Per impostare un’area di swap (esempio sda2), si utilizza il comando mkswap:

 

mkswap /dev/sda2

 

Attenzione: Tutti i dati nella partizione specificata andranno perduti.

 

-Per abilitare la partizione per lo swap:

 

swapon /dev/sda2

 

Per abilitare la partizione per lo swap durante l’avvio del sistema, aggiungere questa riga al file fstab:

 

/dev/sda2 none swap defaults 0 0

 

-Ripristino ibernazione dal file di swap

Per ripristinare il sistema da un file di swap dopo un’ibernazione, richiede l’aggiunta di un parametro al kernel. Questo parametro segue lo schema resume_offset=<Swap File Offset>.

 

Il valore di <Swap File Offset> può essere ricavato dal comando filefrag -v che mostrerà una tabella. Il valore richiesto si trova alla colonna physical della prima riga. Ad esempio:

 

 filefrag -v /swapfile

Filesystem type is: ef53

File size of /swapfile is 4290772992 (1047552 blocks, blocksize 4096)

ext logical physical expected length flags

0 0 7546880 6144

1 6144 7557120 7553023 2048

2 8192 7567360 7559167 2048

 

 

Dall’esempio, il valore di <Swap FIle Offset> è 7546880.

 

Nota: Nel parametro del kernel resume bisogna inserire la partizione (es. resume=/dev/sda1), non il percorso al file di swap! Il parametro resume_offset serve ad indicare il blocco sul disco dove inizia il file di swap (es. resume_offset=7546880).

 

-Ottimizzazione delle prestazioni

I parametri dello swap possono essere regolati per aumentare le prestazioni.

 

— Swappiness

 

Il parametro dello swappiness sysctl rappresenta la preferenza (fin l’inibizione) del kernel di utilizzare lo spazio di swap. Swappiness può avere un valore compreso tra 0 e 100. L’impostazione di questo parametro con un valore basso riduce lo scambio di RAM, ed è cosa nota per migliorare la risposta su molti sistemi.

 

con “sysctl -w” scrivete le variabili

vm.swappiness=1

vm.vfs_cache_pressure=50

 

 

— Priorità

Se si dispone di più di un file di swap o una partizione di swap si dovrebbe prendere in considerazione l’assegnazione di un valore di priorità (da 0 a 32767) per ogni area di swap. Il sistema utilizzerà aree di swap di priorità più elevata (numero più alto) prima di utilizzare aree di swap di priorità inferiore.

Ad esempio, se si dispone di un disco più veloce (/dev/sda) ed un disco lento (/dev/sdb), assegnare una priorità superiore per l’area di swap dove si trova il dispositivo più veloce.

Le priorità possono essere assegnati in fstab attraverso il parametro pri:

 

/dev/sda1 none swap defaults,pri=100 0 0

/dev/sdb2 none swap defaults,pri=10 0 0

 

Oppure attraverso il parametro di swapon −p (o −−priority):

 

# swapon -p 100 /dev/sda1

 

Ciaooooooooooooooooooooo

 

Precedente Tracker miner avido Successivo Che bello è TDE