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?
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
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!