2014-10-22 8 views
6

Sto lavorando su un sistema embedded con 512 MB di RAM e memoria di scambio sufficiente per supportare l'applicazione. Dal kernel, ho limitato la dimensione della RAM dall'argomento cmd del kernel a 130 MB. E disabilitato lo swap usando swapoff -a. Ho anche disabilitato il overcommit del kernel, in modo che l'applicazione possa essere eseguita nella sola memoria fisica. Ho verificato le modifiche da /proc/cmdline e /proc/meminfo. Ora quando eseguo l'applicazione e controllo i valori principali, VSZ per la mia applicazione è 177m che è più della memoria effettiva !! Com'è possibile? Da dove viene questa memoria?Perché l'utilizzo della memoria è più della RAM fisica in Linux?

+2

memoria mappata file? Stessa memoria mappata due volte nello spazio degli indirizzi virtuali? Controlla la mappa della memoria di processo. –

+0

http://linuxatemyram.com/ e '/ proc/$ PID/maps' –

risposta

6

VSZ è la dimensione della memoria virtuale che viene utilizzata dal processo. È normale che sia superiore alla dimensione della memoria fisica perché questa è una delle idee principali di questo. Si dovrebbe piuttosto guardare la dimensione residente (RSS) che è la memoria fisica effettiva utilizzata dal processo.

Guardate questo esempio:

Ho un processo in esecuzione nginx:

ps -o rss,vsz,cmd ax | grep -i nginx | head -n1 
    956 31248 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 

rss - 956 kB 
vsz - 31248 kB 

Quindi, significa che questo processo sta utilizzando 956KB di memoria fisica, e 31MB di memoria virtuale.

Disabilitare lo swap (swapoff -a), come hai fatto tu, non disabilita l'uso della memoria virtuale.

Leggi sulla memoria virtuale qui: Virtual memory

+0

E 'possibile impostare un limite sulla memoria virtuale ?? Sono solo curioso ... – Griffin

+0

Non penso che tu abbia spiegato perché 'swapoff -a' non ha come risultato l'utilizzo di VMM. * lo scambio * viene utilizzato solo per la memoria * read-write * o per i dati del programma. Per il codice del programma, il file system virtuale * di Linux * ha un modo per individuare (ricaricare) una pagina. Se il codice salta a un indirizzo, il codice * faults * e i dati vengono caricati dal disco. In questo modo, quando un programma inizia, il tutto non viene caricato in memoria; solo la * pagina di indirizzo * start *. Allo stesso modo quando sotto la pressione della memoria, il codice usato raramente può essere urtato. –