Perché Linux segnala stranamente la memoria "libera"?


44

Questa è una domanda canonica su come i sistemi operativi Unix riportano l'utilizzo della memoria.
Domande simili:

Ho un server di produzione che esegue Debian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Ogni giorno cron esegue lo script di backup come root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Tutto funziona perfettamente, ma noto che il grafico della memoria di Munin mostra un aumento della cache e dei buffer dopo il backup.

Quindi scarico solo i file di backup ed eliminarli. Dopo l'eliminazione, il grafico della memoria di Munin riporta cache e buffer allo stato precedente al backup.

Ecco il grafico di Munin:

L'immagine ospitata esternamente era un collegamento non funzionante.


3
Congratulazioni, questa domanda è stata canonizzata (è come la sesta oggi che chiede questo, e sembra avere l'esempio più interessante e più grazioso :-)
voretaq7

Risposte:


27

Questo è lo stesso "problema" che da Server rifiuta di utilizzare la partizione di swap e alcune altre domande simili su questo sito. ( Utilizzo di memoria elevata su server Linux , utilizzo di memoria in LINUX , server Web con memoria insufficiente , ecc.)

Prestare attenzione al fatto che il consumo di memoria proviene dalla cache . Ciò significa che mantiene un file in memoria. La memoria cache è memoria "libera". Invece di lasciare vuoto il blocco di memoria, il tuo sistema operativo mantiene i file letti di recente in quello spazio. Se un'applicazione necessita di tale memoria, verrà utilizzata dall'applicazione. Fino ad allora, c'è una possibilità per salvare il tuo da dover leggere di nuovo un file dal disco se viene frequentemente referenziato.

Secondo questo grafico, il consumo effettivo di memoria non è cambiato affatto per l'intera durata del grafico.


È possibile indicare al server di non memorizzare nella cache questi file? Immagino che dovrei eseguire sync; echo 3 > /proc/sys/vm/drop_cachesdopo il backup?

13
@ stan31337 Sì, è possibile, no non dovresti farlo. Avere questo file in memoria non ti costa nulla. Se si cancellano tutte le cache, tutti i file memorizzati nella cache e devono essere letti nuovamente dal disco rallenteranno il sistema. Lascia che faccia quello per cui è stato progettato.
Jeff Ferland,

2
@ stan31337 Quando elimini il tuo file di backup, il sistema operativo lo elimina automaticamente dalla cache (ecco perché la tua memoria libera salta di nuovo dopo averlo eliminato) - Linux è abbastanza intelligente da sapere che un file che non è aperto e non può essere raggiunti dall'albero del filesystem non si accederà mai più. Come Jeff ha detto che sicuramente non vuoi scaricare tutta la cache di FS (il sistema dovrà solo rileggere e re-cache quei dati dal disco, il che renderà il tuo server più lento per un po ')
voretaq7

61

Hai riscontrato il problema Linux Ate My Ram .

Non fatevi prendere dal panico.

Questo non è un problema.

Il sistema funziona come previsto.

Il problema non è il tuo sistema operativo - il problema è la tua comprensione della memoria "libera".


I sistemi Unix usano la memoria per qualcosa di più dei semplici programmi in esecuzione. La memoria potrebbe essere utilizzata per:

  • Programmi in esecuzione (attivo / usato)
  • Buffering dei dati in transito (buffer)
  • Dati memorizzati nella cache recentemente letti / scritti sul disco (cache)
  • Assolutamente niente (gratuito)

Ciò che segue è un breve (e in gran parte incompleto) tour su come i moderni sistemi Unix riportano l'utilizzo della RAM.

Che cos'è la memoria libera (la definizione del sistema operativo) ?

Quando un sistema Unix riporta RAM come Free significa "Non sto usando questa RAM per niente".
La RAM libera è effettivamente inutile - Non sta rendendo il tuo sistema più veloce, è semplicemente seduto lì "libero" nel caso in cui qualcosa ne abbia bisogno. Quel qualcosa potrebbe essere uno dei tre altri elementi che ho menzionato sopra.

Cosa sono le memorie cache e buffer?

La memoria cache e buffer è la RAM utilizzata dal sistema operativo per rendere il sistema più veloce.
Questa memoria non è necessaria per l'esecuzione dei programmi in questo momento , quindi il tuo sistema operativo lo utilizza per contenere i dati di cui ha bisogno frequentemente - ad esempio la libreria C (necessaria praticamente per ogni programma che esegui) è quasi sempre tenuta in cachememoria, quindi il il sistema non deve andare sul disco per trovare le istruzioni necessarie per stampare "Hello World" sullo schermo.
In realtà è molto più complicato di così - c'è memoria condivisa , memoria cablata , ecc. - Ma per i nostri scopi questa semplice spiegazione è adeguata.

Cos'è la memoria attiva?

La memoria attiva fa parte della nostra comprensione della memoria "usata" - RAM utilizzata dalle applicazioni per qualsiasi cosa essi facciano - ordinamento dei fogli di calcolo, pubblicazione di pagine Web, modifica della grafica, ecc.
La memoria "attiva" è stata "attiva" di recente - - il programma che afferma di aver fatto uso del suo contenuto (lettura o scrittura) e non è considerato un buon candidato per lo scambio.

Che cos'è la memoria inattiva?

Come la memoria attiva, la memoria inattiva è la RAM utilizzata dalle applicazioni per qualsiasi cosa essi facciano. La differenza è che questa memoria non è stata raggiunta da un po 'di tempo, quindi se push arriva a spingere il sistema operativo pensa che possa essere scambiato su disco e (con un po' di fortuna) il programma affermando che non lo chiederà più, quindi non lo noterò mai.

Cos'è la memoria "Usato" (la definizione UMANA)

Quello che tu e io pensiamo come memoria "usata" è, essenzialmente, la somma della memoria attiva e inattiva. Tutta la RAM attualmente richiesta dalle applicazioni per il loro uso.
Finché hai più RAM installata rispetto alla somma della memoria attiva e inattiva (più un bel margine di sicurezza di 512-1024 MB in alto) sei in un posto OK: il tuo sistema operativo probabilmente non colpirà lo swap e ucciderà le prestazioni .

Che cos'è la memoria "libera" (la definizione UMANA) ?

Quello che io e te consideriamo come memoria "libera" è la memoria disponibile per eseguire i programmi.
Questo è leggermente più complicato della semplice cifra "Free" riportata dai tuoi SO. Quando un programma richiede RAM, il sistema operativo tenterà di ottenere quella RAM nel modo meno distruttivo possibile:

  • Se è disponibile memoria libera (restando in giro senza fare nulla) verrà allocata la RAM.
  • Se non è disponibile memoria libera, il sistema operativo cannibalizzerà lo spazio della cache e del buffer: verranno eliminati gli elementi con accesso più recente / meno frequente nel pool di buffer e quella RAM fornita al programma.
  • Se non c'è RAM Buffer / Cache per cannibalizzare, lo swapper guarderà la memoria inattiva e sceglierà le regioni che ritiene abbiano meno probabilità di accedere. I dati verranno pagati per lo swap (disco) e la RAM appena liberata fornita al programma.
  • Se tutta la RAM inattiva è stata scambiata, lo swapper inizierà a mettere la RAM attiva sul disco.
    (Questo è dove le prestazioni vanno di solito ai cani: ogni volta che un programma fa il suo turno sulla CPU, i suoi bit sostituiti devono essere riportati nella RAM, il che significa che la memoria attiva di qualche altro programma deve essere scambiata - il l'elevato turnover in swap è chiamato thrashing )
  • Se il sistema ha scambiato tutto il possibile (e riempito la partizione di swap), o se stai eseguendo un sistema senza una partizione di swap, succedono cose cattive . A questo punto si verificherà una delle due cose:
    • malloc()avrà esito negativo. Questo è il comportamento conforme a POSIX: il sistema operativo comunicherà al programma che richiede RAM che non è in grado di soddisfare la richiesta.
      Il programma può richiedere meno RAM oppure, se non può accontentarsi di un pezzo di memoria più piccolo, può ripulire ed uscire. (Se il programma è scritto male, si bloccherà semplicemente.)
    • Se sei su un box Linux, OOM-Killer potrebbe andare su una gang in stile gang-killer uccidendo la follia, terminando altri processi per provare a liberare abbastanza RAM per soddisfare la richiesta.
      Nel caso in cui non riesci a capire dalla mia descrizione qui e dalla mia risposta sulla domanda collegata, penso che questo sia un modo terribile per affrontare il problema.

Perché la RAM libera aumenta quando elimini i file?

Nell'esempio della domanda qui hai notato che è possibile "liberare" la RAM eliminando il file di backup - la spiegazione è abbastanza semplice: dal momento che nulla utilizza quel file (nessun handle di file aperto) e non è più accessibile da il filesystem (non collegato) il sistema operativo sa che nessuno accederà mai più a quei dati e cancella i dati dalla cache del filesystem.
Questo rende il rapporto del sistema operativo più memoria libera, ma non ha alcun impatto sulle prestazioni del sistema.


Ora è perfettamente chiaro per me ... La mia esperienza Linux è in qualche modo di 2 mesi, tutto è iniziato con questo server Debian. Un mese fa ho installato Gentoo sul mio laptop di casa e sono rimasto così sorpreso dalle sue prestazioni, che sono cambiate completamente da utente Windows a utente Linux anche sul mio computer di lavoro. È fantastico imparare Linux con Gentoo, e c'è ancora molto da imparare.

@ stan31337 Non sei l'unico per cui non è chiaro - è particolarmente difficile per le persone che provengono da uno sfondo di Windows perché, a meno che non ci passi dentro, Windows non segnala l'utilizzo della memoria con questo livello di dettaglio - è solo "Usato" (dai programmi ) e "Gratis" (per i programmi da prendere). Gli utenti Mac hanno un po ' più facile perché Activity Monitor è fondamentalmente una versione grafica di tope riporta RAM libera / cablata / attiva / inattiva.
voretaq7,

Lavoravo con Process Explorer su Windows, aveva un sacco di cose da mostrare in memoria, ma la maggior parte di loro erano così poco chiare per me che in realtà non le

2
Inoltre, va notato che, sebbene Windows non lo mostri in modo così dettagliato, ha una configurazione molto simile.
Joachim Sauer,

Sai, anche in Windows la lettura della memoria è confusa. Questo è qualcosa su cui i produttori di sistemi operativi potrebbero voler porre maggiore enfasi, o piuttosto qualcosa a cui agli utenti dovrebbe interessare meno di quanto non faccia attualmente.
gparent

2

Qualcos'altro da verificare se quanto sopra fallisce:

Controllare l'utilizzo della cache Slab ( Slab:, SReclaimable:e SUnreclaim:in /proc/meminfo). Questa è una cache di strutture di dati nel kernel ed è separata dalla cache della pagina riportata da free.

Se la cache slab è resposible per gran parte della tua "memoria mancante", controlla /proc/slabinfodove è andata. Se si tratta di dentisti o inode, puoi usarli sync ; echo 2 > /proc/sys/vm/drop_cachesper sbarazzartene.

Puoi anche usare lo slabtopstrumento per mostrare l'utilizzo corrente della cache Slab in un formato intuitivo. cordina l'elenco in base alla dimensione della cache corrente.

Da: https://stackoverflow.com/a/5467207

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.