2012-05-01 10 views
9

Analizuję dane z /proc/[pid]/statm, aby uzyskać wskazówkę dotyczącą użycia pamięci określonego procesu. man proc stwierdza, że ​​rozmiar zestawu rezydentnego o rozmiarze (mierzony na "stronach") jest taki sam jak VmRSS (KB?) W /proc/[pid]/status. Ponieważ mają różne wartości, chciałbym zrozumieć związek między tymi wartościami. Czy istnieje coś takiego jak czynnik, który mogę odczytać gdzieś w /proc (myślałem o VmPTE, ale o czymś innym ...)? Którego z nich należy przeanalizować, aby uzyskać rozmiar używanej pamięci dla określonego procesu?Jak dopasować rozmiar zestawu VmRSS i rezydenta?

#ex 1782 = firefox 

~$ cat /proc/1782/statm 
    224621 46703 9317 11 0 98637 0 
#   \--- resident set size 

~$ cat /proc/1782/status | grep Vm 
    VmPeak:  935584 kB 
    VmSize:  898484 kB 
    VmLck:   0 kB 
    VmHWM:  257608 kB 
    VmRSS:  186812 kB 
    VmData:  394328 kB 
    VmStk:   220 kB 
    VmExe:   44 kB 
    VmLib:  61544 kB 
    VmPTE:  1224 kB 
    VmSwap:   0 kB 

Odpowiedz

13

Rozumiem, że VM to ilość pamięci wirtualnej i RSS to ile to ma miejsce zamieszkania w pamięci. Więc

pamięci wirtualnej = część w pamięci fizycznej + części na dysku

Część pamięci fizycznej jest RSS. Tak więc VSS powinna być większa niż RSS. Jeśli są bliskie równości, oznacza to, że twój proces siedzi wygodnie w pamięci. Jeśli VSS jest znacznie większa, oznacza to, że nie ma wystarczającej ilości pamięci, a jej części muszą zostać zamienione na dysk (tj. Z powodu konkurencyjnego procesu itp.).

W moim systemie, mogę zrobić „man proc” i wymienia następujące:

  * VmPeak: Peak virtual memory size. 

      * VmSize: Virtual memory size. 

      * VmLck: Locked memory size (see mlock(3)). 

      * VmHWM: Peak resident set size ("high water mark"). 

      * VmRSS: Resident set size. 

      * VmData, VmStk, VmExe: Size of data, stack, and text segments. 

Jeśli chcesz zgłosić zużycie pamięci szczyt, to prawdopodobnie chcą pamięci wirtualnej, która wygląda jak VmPeak .

Mam nadzieję, że to pomoże!

+0

nie wiem, gdzie można uzyskać wartość z proc, ale myślę, że moja pagesize jest 4KB. Byłem zdezorientowany przez VmPTE. Wydaje się, że jest to raczej "rozmiar [pid] części strony tabeli stron", a następnie "rozmiar pozycji bufora" :) – lupz

+0

Tak, wiele z tych wartości zależy od systemu. W niektórych systemach, z którymi pracowałem, niektóre z tych wartości zawsze dają 0, ponieważ wsparcie nie zostało wkompilowane w jądro. Więc tak, nie wierz w to, co mówią strony mojego mana, ponieważ mogą one nie być odpowiednie dla twojego systemu. – Ray

+2

Rzeczywiście, pamięć wirtualna = część w pamięci RAM + część na dysku + wirtualna przestrzeń adresowa niepopielona na pamięć fizyczną + pliki odwzorowane w pamięci + pamięć współdzielona. Aby zmierzyć zużycie pamięci, VmSize jest całkiem bezużyteczny. Zobacz pierwszą odpowiedź na http://stackoverflow.com/questions/13308684/increase-of-virtual-memory-without-increse-of-vmsize – vcarel

23

Wartość RSS /proc/<pid>/stat to liczba stron, natomiast wartość VmRSS wynosząca /proc/<pid>/status jest w kB.

W twoim przypadku 46703 * 4kB (rozmiar strony) = 186812 kB.

+2

@lupz, rozważ zatwierdzenie tej odpowiedzi, która wydaje się poprawna. jak udokumentowano na stronie [proc (5)] (http://linux.die.net/man/5/proc). –

4

Man aktualizacja proc stanach podążając statm kontekście

/proc/[pid]/statm 
Provides information about memory usage, measured in pages. The columns are: 

    size  (1) total program size 
      (same as VmSize in /proc/[pid]/status) 
    resident (2) resident set size 
      (same as VmRSS in /proc/[pid]/status) 
    share  (3) shared pages (i.e., backed by a file) 
    text  (4) text (code) 
    lib  (5) library (unused in Linux 2.6) 
    data  (6) data + stack 
    dt   (7) dirty pages (unused in Linux 2.6) 

ale to, co nie zgłasza, że ​​jest size i resident są wyrażone w liczbie stron.

~$ cat /proc/1782/statm 
    224621 46703 9317 11 0 98637 0 
#   \--- resident set size 

Zatem 46703 zamieszkuje wielkość zestaw wyrażone w liczbie stron i 224621 jest Wirtualna Wielkość pamięci wyrażona w liczbie stron, jak również.

Teraz, aby uzyskać je w KB, pomnóż je za pomocą opcji Rozmiar strony. Możesz uzyskać rozmiar strony za pomocą polecenia getconf PAGESIZE lub w programie C/C++, wywołując sysconf(_SC_PAGE_SIZE) (zdefiniowane w unistd.h). Da ci to rozmiar strony w bajtach. Podziel go na 1024, aby uzyskać rozmiar strony w KB.

przykład:

$getconf PAGESIZE 
4096 

4096/1024 = 4 KB

ten sposób mieszkaniec zestaw rozmiar w KB jest 46703 x 4 = 186812 kB (VmRSS).
rozmiar całego programu w KB jest 224621 x 4 = 898484 KB (VmSize)

Powiązane problemy