2012-05-01 34 views
9

Tôi phân tích cú pháp dữ liệu từ /proc/[pid]/statm để nhận được manh mối về việc sử dụng bộ nhớ của một quá trình nhất định. man proc khẳng định rằng cư dân thiết lập kích thước (đo trong 'trang') cũng giống như VmRSS (KB ??) trong /proc/[pid]/status. Vì chúng có các giá trị khác nhau nên tôi muốn hiểu kết nối giữa các giá trị này. Có cái gì đó giống như một yếu tố tôi có thể đọc ở đâu đó trong /proc (Tôi nghĩ về VmPTE nhưng nó sth. Khác ...)? Tôi nên phân tích cú pháp nào để lấy kích thước của Bộ nhớ đã sử dụng cho một quy trình nhất định?Làm thế nào để VmRSS và kích thước tập hợp thường trú phù hợp?

#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 

Trả lời

13

Hiểu biết của tôi là VM là lượng bộ nhớ ảo và RSS là số lượng bộ nhớ ảo nằm trong bộ nhớ. Vì vậy,

bộ nhớ ảo = một phần trong bộ nhớ vật lý + một phần trên đĩa

Phần trong bộ nhớ vật lý là RSS. Vì vậy, VSS nên lớn hơn RSS. Nếu họ gần bằng nhau, điều đó có nghĩa là quá trình của bạn đang ngồi thoải mái trong bộ nhớ. Nếu VSS lớn hơn nhiều, điều đó có nghĩa là không có đủ bộ nhớ và các bộ phận của nó phải được hoán đổi ra đĩa (tức là, do quá trình cạnh tranh, v.v.).

Trên hệ thống của tôi, tôi có thể làm một "người đàn ông proc" và nó sẽ liệt kê như sau:

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

Nếu bạn muốn báo cáo việc sử dụng bộ nhớ cao điểm, sau đó bạn có thể muốn bộ nhớ ảo, trông giống như VmPeak .

Hy vọng điều này sẽ hữu ích!

+0

Tôi không biết nơi nào để có được giá trị từ proc, nhưng tôi nghĩ pagesize của tôi là 4KB. Tôi đã nhầm lẫn với VmPTE. Nó có vẻ là 'kích thước của phần [pid] của bảng trang', sau đó 'kích thước của một mục đệm' :) – lupz

+0

Có, rất nhiều các giá trị này phụ thuộc vào hệ thống. Trong một số hệ thống tôi đã làm việc với, một số giá trị đó sẽ luôn cung cấp 0 vì hỗ trợ chưa được biên dịch vào nhân. Vì vậy, có, không tin những gì người đàn ông trang của tôi nói như họ có thể không có liên quan đến hệ thống của bạn. – Ray

+2

Trên thực tế, bộ nhớ ảo = một phần trong RAM + một phần trên đĩa + không gian địa chỉ ảo không được ánh xạ tới bộ nhớ vật lý + các tệp được ánh xạ bộ nhớ + bộ nhớ dùng chung. Vì vậy, để đo lường mức tiêu thụ bộ nhớ, VmSize là khá vô ích. Xem câu trả lời đầu tiên cho http://stackoverflow.com/questions/13308684/increase-of-virtual-memory-without-increse-of-vmsize – vcarel

23

Giá trị RSS của /proc/<pid>/stat là số trang, trong khi giá trị VmRSS là /proc/<pid>/status bằng kB.

Trong trường hợp của bạn, 46703 * 4kB (kích thước trang) = 186812 kB.

+2

@lupz, xem xét xác thực câu trả lời này có vẻ đúng. như được ghi trong trang [proc (5)] (http://linux.die.net/man/5/proc). –

4

trang Man cho proc tình trạng sau trong bối cảnh 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) 

Nhưng những gì nó không ghi là sizeresident được thể hiện ở số trang.

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

Như vậy, 46703 là cư dân kích thước bộ trình bày bằng số lượng trang và 224621 là ảo Kích thước bộ nhớ thể hiện bằng số trang là tốt.

Bây giờ để có được chúng trong KB nhân chúng với trang Kích. Bạn có thể nhận được Kích thước trang bằng lệnh getconf PAGESIZE hoặc trong chương trình C/C++ bằng cách gọi sysconf(_SC_PAGE_SIZE) (được định nghĩa trong unistd.h). Điều này sẽ cho bạn kích thước trang tính theo byte. Chia nó với 1024 để có kích thước trang bằng KB.

Ví dụ:

$getconf PAGESIZE 
4096 

4096/1024 = 4 KB

Do đó, cư dân bộ kích thước trong KB là 46.703 x 4 = 186.812 kB (VmRSS).
kích thước Tổng số Chương trình trong KB là 224.621 x 4 = 898.484 kB (VmSize)

Các vấn đề liên quan