2012-05-01 2 views
9

Я анализирую данные от /proc/[pid]/statm, чтобы получить представление об использовании памяти определенного процесса. man proc утверждает, что резидентный размер набора (измеряется в «страницах») совпадает с VmRSS (KB ??) в /proc/[pid]/status. Поскольку они имеют разные значения, я хотел бы понять связь между этими Значениями. Есть ли что-то вроде фактора, который я могу прочитать где-то в /proc (я думал о VmPTE, но его еще ...)? Какой из них должен анализировать, чтобы получить размер используемой памяти для определенного процесса?Как VmRSS и размер резидентного набора совпадают?

#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 

ответ

13

Я понимаю, что виртуальная память - это количество виртуальной памяти, а RSS - это то, сколько она находится в памяти. Так,

виртуальной памяти = часть в физической памяти + часть на диске

Часть физической памяти RSS. Таким образом, VSS должен быть больше, чем RSS. Если они близки к равным, это означает, что ваш процесс удобно находится в памяти. Если VSS намного больше, это означает, что памяти недостаточно, и ее части должны быть заменены на диск (т. Е. Из-за конкурирующего процесса и т. Д.).

В моей системе, я могу сделать «человек прок» и перечисляет следующее:

  * 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. 

Если вы хотите сообщить использование пик памяти, то вы, вероятно, хотите, виртуальная память, которая выглядит как VmPeak ,

Надеюсь, это поможет!

+0

Я не знаю, где, чтобы получить значение от прока, но я думаю, что мой размер_страницы является 4KB. Меня смутил VmPTE. Похоже, что это «размер [pid] s части таблицы страниц», затем «размер записи в буфере» :) – lupz

+0

Да, многие из этих значений зависят от системы. В некоторых системах, с которыми я работал, некоторые из этих значений всегда будут давать 0, потому что поддержка не была скомпилирована в ядро. Так что да, не верьте тому, что говорят мои страницы, поскольку они могут не иметь отношения к вашей системе. – Ray

+2

Фактически, виртуальная память = часть в ОЗУ + часть на диске + виртуальное адресное пространство, не отображаемое в физическую память + файлы с отображением памяти + разделяемая память. Поэтому для измерения потребления памяти VmSize довольно бесполезен. Посмотрите первый ответ на http://stackoverflow.com/questions/13308684/increase-of-virtual-memory-without-increse-of-vmsize – vcarel

23

Значение RSS /proc/<pid>/stat - это количество страниц, тогда как значение VmRSS /proc/<pid>/status находится в kB.

В вашем случае 46703 * 4kB (размер страницы) = 186812 kB.

+2

@lupz, подумайте о подтверждении этого ответа, который кажется правильным. как описано в [proc (5)] (http://linux.die.net/man/5/proc) manpage. –

4

Man страница для proc состояний в следующих statm контексте

/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) 

Но что она не сможет утверждать, что это size и resident выражаются в количестве страниц.

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

Таким образом, 46703 является резидентом установить размер выражается в количестве страниц и 224621 это виртуальный размер памяти выражается в количестве страниц, а также.

Теперь, чтобы получить их в КБ, умножьте их на размер страницы. Вы можете получить размер страницы с помощью команды getconf PAGESIZE или в программе C/C++ по телефону sysconf(_SC_PAGE_SIZE) (определен в unistd.h). Это даст вам размер страницы в байтах. Разделите его на 1024, чтобы получить размер страницы в КБ.

Пример:

$getconf PAGESIZE 
4096 

4096/1024 = 4 КБ

Таким образом, житель размер набора в КБ составляет 46703 х 4 = 186812 кБ (VmRSS).
размера Общей программы в КБ составляет 224621 х 4 = 898484 кБ (VmSize)

Смежные вопросы