Bạn có thể lấy loại thông tin đó từ /proc/<pid>/smaps
tệp cho mỗi quy trình dưới dạng Pss
mụ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ĩ ps
có 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 pagemap
bở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à smaps
tệp nếu bạn quan tâm đến điều đó.