2012-03-29 22 views
15

Tôi đã bối rối về cột PSS trong/proc/pid/smaps, vì vậy tôi đã viết một chương trình để kiểm tra nó:gì PSS nghĩa trong/proc/pid/smaps

void sa(); 
int main(int argc,char *argv[]) 
{ 
    int fd; 
    sa(); 
    sleep(1000); 
} 

void sa() 
{ 
    char *pi=new char[1024*1024*10]; 
    for(int i=0;i<4;++i) { 
     for(int j=0;j<1024*1024;++j){ 
       *pi='o'; 
       pi++; 
     } 
    } 
    int cnt; 
    for(int i=0;i<6;++i) { 
     for(int j=0;j<1024*1024;++j){ 
       cnt+=*pi; 
       pi++; 
     } 
    } 
    printf("%d",cnt); 
} 

$cat /proc/`pidof testprogram`/smaps 

08838000-0885b000 rw-p 00000000 00:00 0   [heap] 
Size:    140 kB 
Rss:     12 kB 
Pss:     12 kB 
Shared_Clean:   0 kB 
Shared_Dirty:   0 kB 
Private_Clean:   0 kB 
Private_Dirty:  12 kB 
Referenced:   12 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 
b6dcd000-b77d0000 rw-p 00000000 00:00 0 
Size:    10252 kB 
Rss:    10252 kB 
Pss:    4108 kB 
Shared_Clean:   0 kB 
Shared_Dirty:   0 kB 
Private_Clean:   0 kB 
Private_Dirty:  4108 kB 
Referenced:   4108 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

Ở đây tôi tìm thấy pss bằng Private_Dirty, nhưng tôi tự hỏi tại sao.

BTW: có tài liệu chi tiết nào cho smaps không?

Trả lời

27

Trích dẫn từ lwn.net

Các "tỷ lệ thiết lập kích thước" (PSS) của một quá trình là số lượng của các trang nó có trong bộ nhớ, trong đó mỗi trang được chia cho số quá trình chia sẻ nó. Vì vậy, nếu một quá trình có 1000 trang tất cả để bản thân, và 1000 chia sẻ với một quá trình khác, PSS của nó sẽ là 1500

Từ Linux Kernel Documentation,

Các /proc/PID/smaps là một phần mở rộng dựa trên bản đồ, hiển thị bộ nhớ mức tiêu thụ cho từng ánh xạ của quá trình. Đối với mỗi ánh xạ có là một loạt các dòng như sau:

08048000-080bc000 r-xp 00000000 03:02 13130  /bin/bash 
Size:    1084 kB 
Rss:     892 kB 
Pss:     374 kB 
Shared_Clean:  892 kB 
Shared_Dirty:   0 kB 
Private_Clean:   0 kB 
Private_Dirty:   0 kB 
Referenced:   892 kB 
Anonymous:    0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 
Locked:    374 kB 

Việc đầu tiên của những dòng này hiển thị thông tin tương tự như được hiển thị cho việc lập bản đồ trong /proc/PID/bản đồ . Các dòng còn lại hiển thị kích thước của ánh xạ (kích thước), số lượng các bản đồ hiện là thường trú tại RAM (RSS), quá trình này cổ phiếu theo tỷ lệ của bản đồ này (PSS), các số trang riêng tư sạch và bẩn trong ánh xạ. Lưu ý rằng ngay cả trang là một phần của bản đồ MAP_SHARED, nhưng chỉ có chỉ một ánh xạ pte, nghĩa là hiện chỉ được sử dụng bởi một quá trình, được tính là riêng tư và không được chia sẻ. "Đã tham chiếu" cho biết số lượng bộ nhớ hiện được đánh dấu là được tham chiếu hoặc truy cập. "Ẩn danh" hiển thị lượng bộ nhớ không thuộc bất kỳ tệp nào. Ngay cả ánh xạ được liên kết với một tệp có thể chứa các trang ẩn danh: khi MAP_PRIVATE và một trang được sửa đổi, trang tệp là được thay thế bằng một bản sao ẩn danh riêng tư. "Hoán đổi" cho biết số lượng bộ nhớ ẩn danh sẽ được sử dụng, nhưng ra trên trao đổi.

This Question trên Unix and Linux Stackexchange bao gồm gần như chủ đề. Xem câu trả lời tuyệt vời của Mat mà chắc chắn sẽ xóa tất cả những nghi ngờ của bạn.

+0

Tại sao tôi thấy nhiều PSS, khi tôi chạy các smaps trên nhị phân của mình. Đây là đầu ra của một trong các mã nhị phân -Locked: 0 kB 77afd000-77afe000 r - p 00007000 00: 0e 20581089/lib/ld-uClibc-0.9.33.2.so.Tôi có cần phải thêm tất cả các PSS để thực sự tính kích thước được thực hiện bởi các nhị phân. Kích thước này bằng với kích thước chiếm trong RAM? Kích thước: 4 kB Rss: 4 kB Pss: 4 kB Private_Dirty: 4 kB Tham chiếu: 4 kB Anonymous: 4 kB AnonHugePages: 0 kB 77ab2000-77ad6000 r-xp 00000000 00: 0e 20711467/usr/lib/libdbus- glib-1.so.2.2.0 Kích thước: 144 kB Rss: 112 kB Pss: 12 kB –