Domanda :Cosa sono le pagine sporche e qual è il loro scopo?
Ogni volta che il processo dell'applicazione/del database deve aggiungere una pagina virtuale alla memoria fisica ma non rimangono pagine fisiche libere, il sistema operativo deve cancellare le vecchie pagine rimanenti.
Ora, se la vecchia pagina non è stata scritta affatto, questa non ha bisogno di essere salvata, può essere semplicemente recuperata dal file di dati. Ma se la vecchia pagina è già stata modificata, allora deve essere conservata da qualche parte in modo che l'applicazione/database possa essere riutilizzata in seguito:questa è chiamata pagina sporca.
Il sistema operativo memorizza tali pagine sporche nei file di scambio (quindi può essere rimosso dalla memoria fisica in modo che un'altra pagina "nuova" possa essere archiviata nella memoria fisica) Se molti dati verranno rimossi dalla cache della pagina nell'area della pagina sporca, ciò potrebbe causare un I/O significativo collo di bottiglia se il dispositivo di scambio effettivo si trova sul disco locale ( sda ) e inoltre causa ulteriori problemi se il disco locale viene utilizzato anche dal disco root locale ( OS ).
La cache della pagina in Linux è solo una cache del disco che offre prestazioni aggiuntive al sistema operativo che aiuta con letture/scritture elevate e intensive sui file.
Poiché il prodotto "sottoposto" della cache della pagina è pagina sporca, come spiegato nel caso di esempio sopra. Le pagine sporche possono essere osservate anche ogni volta che l'applicazione scriverà su file o creerà un file - la prima scrittura avverrà nell'area della cache della pagina - quindi creando un file con un file da 10 MB può essere davvero veloce:
# dd if=/dev/zero of=testfile.txt bs=1M count=100 10+0 records in 10+0 records out 10485760 bytes (100 MB) copied, 0,1121043 s, 866 MB/s
È perché quel file viene creato nella regione di memoria non nel disco effettivo, quindi il tempo di risposta è davvero veloce. Sotto il sistema operativo tale cosa verrà annotata in /proc/meminfo e altro in "Dirty:
Prima che il comando precedente venga eseguito:annota la riga /proc/meminfo e "Dirty":
# more /proc/meminfo | grep -i dirty Dirty: 96 kB
Dopo l'esecuzione del comando:
# more /proc/meminfo | grep -i dirty Dirty: 102516 kB
Periodicamente il sistema operativo o l'applicazione/database avvierà la sincronizzazione che scriverà il file testfile.txt effettivo sul disco:
# more /proc/meminfo | grep -i dirty Dirty: 76 kB
Ora Oracle Database, ad esempio, non consente di eseguire tali scritture nella regione di memoria come se il sistema operativo si arrestasse in modo anomalo o se SAN LUn fallisse:i dati sarebbero compromessi. Ecco perché Oracle Database richiede che i dati siano "sincronizzati", quindi tutte le scritture devono essere confermate dal back-end come disk/lun prima che il database generi più richieste di scrittura.
Normalmente i database/l'applicazione rilasciano periodicamente la cache, quindi le pagine sporche vengono scritte sul disco in piccoli blocchi. In alcuni casi le pagine sporche possono aumentare di dimensioni poiché forse l'applicazione/il database non ha configurato correttamente il meccanismo della cache delle pagine.
Quindi le pagine sporche possono scrivere su file di scambio (area di scambio) ma anche in una regione speciale del disco (LUN/file-system). Se, ad esempio, creiamo più di 100 MB di file di scambio che verranno riutilizzati in seguito dal file di scambio, potremmo causare problemi di I/O non necessari sul dispositivo di scambio. I sistemi aziendali archiviano i file di scambio e l'area di scambio sul sistema operativo in unità a stato solido (SSD) o LUN dedicata, quindi le prestazioni del disco locale non saranno influenzate (poiché normalmente la regione di scambio viene creata sul disco locale)
In alcuni casi l'applicazione/database potrebbe avere problemi internamente e le pagine sporche verranno scritte come file di scambio ma non verranno mai riutilizzate, ciò causerà la crescita dell'area di scambio e causerà IO non necessari sul disco locale e porterà a un ampio utilizzo di scambio nel sistema operativo.
Per scoprire in quale fase il sistema operativo proverà a scaricare le pagine sporche sul livello del disco, controlla la documentazione ufficiale del kernel relativa alla memoria virtuale qui e cerca impostazioni come:
vm.dirty_background_ratio vm.dirty_ratio vm.swappiness
e
dirty_background_ratio dirty_ratio dirty_background_bytes dirty_expire_centisecs
Le impostazioni di cui sopra devono essere ottimizzate in base ai requisiti del database/dell'applicazione poiché il sistema operativo non dispone di alcuna impostazione di "best practice" per loro:sono ottimizzate per il carico/configurazione di DB/APP.
Ogni volta che l'applicazione/il database richiederà che le pagine di memoria siano libere sulla memoria fisica, il sistema operativo tende a mantenere tutto nella cache della pagina, quindi il sistema operativo dovrà riallocare alcune pagine e contrassegnarle come sporche. Questo processo funziona correttamente se l'estremità dell'applicazione/del database è regolata e ridimensionata correttamente, altrimenti si verificherà uno swappiness davvero aggressivo, poiché il sistema operativo dovrà riscrivere tutte le pagine sporche sul disco di scambio:questo può essere controllato tramite l'impostazione vm.swappiness.
Se l'applicazione/database eseguirà uno scambio concordato, potrebbe causare gravi scritture IO sul dispositivo di scambio e causare gravi stalli del sistema:assicurati sempre che l'applicazione/i database siano configurati correttamente in termini di gestione della memoria.
Come spiegato, non tutte le pagine verranno contrassegnate come sporche:la maggior parte delle pagine non utilizzate verranno scartate anziché contrassegnate come sporche (tutto dipende dal fatto che le pagine già allocate siano state modificate o meno)
Per verificare quali PID stanno utilizzando l'area di scambio, è possibile utilizzare il comando seguente:
for file in /proc/*/status do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file done | sort -k 2 -n -r
Il rilascio dello spazio di swap "consumato" è davvero limitato, normalmente se il PID esce correttamente o viene semplicemente arrestato lo spazio di swap verrà reclamato ma uccidendo il PID o se finisce in modo anomalo come segfault potrebbe comunque lasciare lo spazio di swap consumato. Un'altra opzione è riavviare poiché eseguire il comando swapoff e swapon può causare seri problemi o addirittura portare a uno stato di panico del sistema.