Làm thế nào để bạn đo dung lượng bộ nhớ của một tập hợp các quá trình rẽ nhánh?


8

Giả sử tôi đã có một quá trình sử dụng 200 MB bộ nhớ và đó là fork ():

python -c "import os; data='x'*200000000; os.fork(); raw_input()"

Các chương trình như 'top' sẽ hiển thị mỗi quy trình sử dụng 200MB, với bộ nhớ SHRd rất ít, do đó, nó xuất hiện như thể các quy trình đang sử dụng tổng cộng 400 MB. Tuy nhiên, vì fork () thực hiện sao chép trên ghi (COW) cho các trang bộ nhớ của quy trình, nên thực tế là các quy trình chỉ sử dụng tổng cộng 200 MB.

Tại sao đầu không hiển thị phần nào của bộ nhớ là COW? Có cách nào để làm cho nó làm như vậy? Hoặc có một lệnh khác tôi có thể sử dụng thay thế?

Lưu ý: 'top' trên OSX dường như có cột RSHRD thực hiện những gì tôi mong đợi. Câu hỏi của tôi là dành cho Linux.

Câu trả lời:


5

Bạn có thể lấy loại thông tin đó từ /proc/<pid>/smapstệp cho mỗi quy trình dưới dạng Pssmục nhập (viết tắt của "Kích thước chia sẻ theo tỷ lệ").

Trong ví dụ trên với 200 MB "chia sẻ" giữa hai quy trình, mỗi quy trình sẽ hiển thị 100 MB trong mục PSS cho ánh xạ đó, tức là bộ nhớ được phân phối đồng đều giữa các quy trình chia sẻ nó (cho đến khi được sao chép và không chia sẻ bởi một trong hai quy trình).

Đây là một trích xuất từ ​​việc chạy một cái gì đó giống như những gì bạn đã đăng:

$ top
...
30986 me        20   0  790m 769m 2200 S    0  4.8   0:00.48 python3.2
30987 me        20   0  790m 767m  224 S    0  4.8   0:00.00 python3.2
$ cat /proc/30986/smaps
...
0119a000-015b7000 rw-p 00000000 00:00 0                                  [heap]
Size:               4212 kB
Rss:                3924 kB
Pss:                1992 kB
...
7fa06b020000-7fa09ab11000 rw-p 00000000 00:00 0 
Size:             781252 kB
Rss:              781252 kB
Pss:              390626 kB
...
7fff8e45a000-7fff8e489000 rw-p 00000000 00:00 0                          [stack]
Size:                192 kB
Rss:                 160 kB
Pss:                  82 kB
...

(Có rất nhiều nội dung trong các tệp đó, bao gồm ánh xạ cho các thư viện dùng chung có khả năng được chia sẻ giữa nhiều quy trình và do đó mỗi quy trình chỉ chiếm một phần nhỏ được ghi trong mục nhập PSS cho các tệp đó.)

Đây là một bài viết hay về điều này: ELC: Ứng dụng thực sự sử dụng bao nhiêu bộ nhớ?

Tôi không biết về một công cụ giống như hàng đầu phổ biến để hiển thị thông tin này và tôi không nghĩ pscó các tùy chọn để hiển thị điều đó một cách đáng tiếc. Bài viết chỉ ra một kho lưu trữ với các kịch bản python được gọi pagemapbởi Matt Mackall mà bạn có thể sử dụng hoặc điều chỉnh mặc dù.

Trình cắm không biết xấu hổ: bạn sẽ tìm thấy một vài bài đăng trên Unix & Linux về PSS và smapstệp nếu bạn quan tâm đến điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.