2013-01-17 31 views
5

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?

  1. 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 
    
  2. 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!

Odpowiedz

2

Kolumna w pozycji top nie zgłasza tej samej rzeczy, co wpis pmap s shared. top raportuje ilość pamięci współużytkowanej z innymi procesami, ponieważ znajduje się w bibliotece dynamicznej, która jest ładowana raz do pamięci, a wszystkie procesy korzystające z tej biblioteki zawierają te same strony w obrazie, ponieważ te strony są tylko do odczytu. pmap wydaje się wyświetlać segmenty "pamięci współużytkowanej", które są stronami danych, które mogą być tylko do odczytu lub zapisu i są współużytkowane między procesami za pomocą shmget() i funkcji pokrewnych.

Powiązane problemy