Perché Red Hat Linux riporta meno memoria libera sul sistema di quella attualmente disponibile?


9

Ho un server Red Hat Linux domestico relativamente piccolo (circa 8 GB di RAM). Non lo uso per molto altro che eseguire alcune app coltivate in casa per tenere traccia di varie cose. Le uniche cose reali in esecuzione sulla scatola sono un database e un web server.

Ho notato che quando si controllano i contatori di sistema utilizzando strumenti come NMON e TOP che la memoria libera totale del sistema è relativamente bassa (nell'ordine di alcune centinaia di MB), mentre la memoria attiva per il database e il server Web è ancora bassa (solo consumando un combinato da 3 GB). Anche quando si includono tutti gli altri processi in esecuzione, la memoria consumata totale è inferiore a 4 GB.

Perché Red Hat Linux riporta meno memoria libera rispetto alla memoria totale meno la somma totale della memoria utilizzata dei processi in esecuzione?

Risposte:


19

Non confondere la memoria libera con la memoria non utilizzata. Memoria libera, nel mondo unix è una pagina di memoria fisica che non ha dati logici associati ad essa. La memoria inutilizzata ha alcuni dati associati ad essa, ma al momento non è in uso attivo da parte di un processo in esecuzione.

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397

Linux (e tutti i sistemi operativi Unix) cercano di avere meno memoria libera possibile. Invece usano la memoria che non è attivamente mappata ai processi nel sistema operativo in esecuzione per cose come cache dei file e buffer per varie operazioni di trasferimento IO.

Qualcos'altro che potrebbe confonderti è che non puoi semplicemente aggiungere la memoria in uso da tutti i processi in esecuzione per ottenere una memoria totale in figura. Se ci provassi, scopriresti rapidamente che le tue applicazioni sembrano utilizzare più memoria di quella esistente sul computer. Questo per due motivi

  1. La memoria può essere condivisa tra vari processi, attraverso l' allocazione della memoria Copy-On-Write , l'IO mappato in memoria e le librerie dinamiche condivise .
  2. Il sistema operativo è libero di promettere più memoria per l'applicazione di quella effettivamente fornita. La teoria è che la maggior parte degli scrittori di applicazioni preferisce richiedere grandi quantità di memoria in una volta sola, per evitare spese generali e potrebbe non utilizzare effettivamente tutta quella memoria.

C'è un recente articolo su lwn.net che tratta questo problema .


1
Una semplice spiegazione è fornita anche qui: linuxatemyram.com
Steven T. Snyder,

4

Linux memorizzerà attivamente nella cache gli accessi al file system per garantire tempi di accesso al disco più rapidi. Non c'è nulla di cui preoccuparsi.

L'esecuzione di -m sulla confezione ti darà un'idea migliore di dove viene utilizzata la memoria.

Di seguito è riportato l'output estratto da una delle mie caselle. La memoria libera è 147Meg con quasi 4G memorizzati nella cache per le richieste di accesso al file system.

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722

1

Includete anche i campi "bufferizzati" e "memorizzati nella cache"?


1

Con Linux, guarda Committed_AS in / proc / meminfo, questa è la quantità di memoria (reale + swap) che il kernel ha effettivamente promesso ai processi in esecuzione.

Linux utilizza la memoria in modo molto efficiente, tutti i blocchi che non sono stati promessi in alcun processo vengono utilizzati per memorizzare nella cache file di recente / accesso frequente. Quindi, è tipico per Linux utilizzare il 90% di tutta la memoria fisica disponibile non molto tempo dopo l'avvio.

Guarda cosa si è impegnato il kernel a fornire .. e sporco (scambio) utilizzo, questo ti dà una visione d'insieme migliore.

Se è necessario modificare questo comportamento, si prega di aggiornare la domanda :)

Questo è il MO standard per Linux .. alcune distribuzioni modificano la gestione della memoria per soddisfare le loro esigenze tramite sysctl. Tuttavia, ciò che riferisci è abbastanza tipico tra tutti.


1

Che tipo di kernel stai eseguendo sul sistema? Un kernel a 32 bit riporterà solo circa 3,6 GB di memoria, a meno che non sia compilato con PAE abilitato.

Detto questo, se questa è una versione moderna di Redhat Enterprise Linux (o CentOS) - dalla v3 in poi - il kernel predefinito a 32 bit lo abiliterà.

Se potessi pubblicare l'output del comando 'free' descritto sopra, saremo in grado di vedere se questo è il problema.

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.