2013-01-17 5 views
5

Ho cercato di ottenere la dimensione della memoria condivisa di un processo su Linux. Ecco il risultato di utilizzare 2 diversi comandi:Come ottenere una dimensione di memoria condivisa accurata di un processo?

  1. superiore e verificare con il campo SHR:

    PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
    1734 root  20 0 201m 4072 1012 S 0.0 0.1 22:00.65 php-fpm 
    
  2. pmap -d:

    mapped: 206672K writeable/private: 4352K shared: 128K 
    

Si può vedere che la dimensione della memoria condivisa in pmap è molto più piccola di quella superiore.

Ho letto qualche codice sorgente per trovare il motivo. Sembra che in alto è la lettura del valore da/proc // statm ei valori sono calcolati da:

unsigned long task_statm(struct mm_struct *mm, 
    unsigned long *shared, unsigned long *text, 
    unsigned long *data, unsigned long *resident) 
{ 
    *shared = get_mm_counter(mm, MM_FILEPAGES); 
    *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) 
                 >> PAGE_SHIFT; 
    *data = mm->total_vm - mm->shared_vm; 
    *resident = *shared + get_mm_counter(mm, MM_ANONPAGES); 
    return mm->total_vm; 
} 

Sembra che tutte le pagine di file vengono conteggiati come memoria condivisa?

E il comando pmap sta leggendo le informazioni da/proc // mappe e poi calcolare la memoria condivisa attraverso alcune bandiere:

3dc822a000-3dc822d000 rw-p 0002a000 08:13 5134288  /usr/lib64/libmcrypt.so.4.4.8 
start-end flags file_offset dev_major:dev_minor inode 

Se le bandiere [3] == 's', allora questa mappa sarà essere contato come uno condiviso.

Quindi la mia domanda è quale è più preciso? E perché hanno metodi diversi per calcolare la dimensione della memoria condivisa?

Grazie in anticipo!

risposta

2

La colonna SHR in top non riporta la stessa cosa che pmap s ingresso shared fa. top sta segnalando la quantità di memoria condivisa con altri processi perché si trova in una libreria dinamica caricata una volta nella memoria e tutti i processi che utilizzano quella libreria includono le stesse pagine nell'immagine, poiché tali pagine sono di sola lettura. pmap sembra mostrare segmenti di "memoria condivisa", che sono pagine di dati che possono essere di lettura-scrittura o di sola lettura e sono condivisi tra i processi con lo shmget() e le funzioni correlate.