Próbowałem uzyskać wielkość pamięci współdzielonej procesu w systemie Linux. Oto wynik stosując 2 różne polecenia:Jak uzyskać dokładny rozmiar pamięci współdzielonej procesu?
górę i sprawdzić, z polem 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
Widać, że rozmiar pamięci współdzielonej w pmap jest znacznie mniejszy niż u góry.
Przeczytałem kod źródłowy, aby znaleźć przyczynę. Wydaje się, że wierzchołek jest odczyt wartości z/proc // statm i wartości są obliczane przez:
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;
}
Wydaje się, że wszystkie strony plików są liczone jako współdzielonej pamięci?
a polecenie pmap czyta informacje z pliku/proc // mapy, a następnie obliczyć pamięci współdzielonej przez kilka flag:
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
Jeśli flagi [3], a następnie tę mapę == „s” będzie liczone jako wspólne.
Moje pytanie brzmi, który z nich jest dokładniejszy? I dlaczego mają różne metody obliczania rozmiaru pamięci współdzielonej?
Z góry dzięki!