Bagaimana Anda mengukur jejak memori dari serangkaian proses bercabang?

8

Katakanlah saya punya proses menggunakan memori 200MB, dan itu fork () s:

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

Program seperti 'top' akan menunjukkan setiap proses menggunakan 200MB, dengan memori SHRd sangat sedikit, sehingga tampak seolah-olah proses menggunakan total 400MB. Namun, karena fork () mengimplementasikan copy-on-write (COW) untuk halaman memori proses, kenyataannya adalah bahwa prosesnya hanya menggunakan total 200MB.

Mengapa tidak menunjukkan sebagian besar dari memori COW? Apakah ada cara untuk melakukannya? Atau adakah perintah lain yang bisa saya gunakan?

Catatan: 'top' di OSX tampaknya memiliki kolom RSHRD yang melakukan apa yang saya harapkan. Pertanyaan saya adalah untuk Linux.

Dustin Boswell
sumber

Jawaban:

5

Anda bisa mendapatkan informasi semacam itu dari /proc/<pid>/smapsfile untuk setiap proses dalam bentuk Pssentri (kependekan dari "Ukuran share proporsional").

Dalam contoh di atas dengan 200MB "dibagi" antara dua proses, setiap proses akan menunjukkan 100MB di entri PSS untuk pemetaan itu, yaitu memori didistribusikan secara merata di antara proses yang membagikannya (sampai disalin dan dibagi dengan kedua proses).

Berikut ekstrak dari menjalankan sesuatu seperti yang Anda poskan:

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

(Ada banyak hal dalam file-file itu, termasuk pemetaan untuk pustaka bersama yang berpotensi dibagi antara banyak proses, dan dengan demikian setiap proses hanya mendapat sebagian kecil yang dimasukkan dalam entri PSS untuknya.)

Inilah artikel yang bagus tentang ini: ELC: Berapa banyak memori yang benar-benar digunakan aplikasi?

Saya tidak tahu tentang alat seperti biasa untuk menampilkan informasi ini, dan saya pikir tidak psmemiliki opsi untuk menunjukkannya. Artikel ini menunjuk ke repositori dengan skrip python yang disebut pagemapoleh Matt Mackall yang bisa Anda gunakan atau adaptasi.

Plug Shameless: Anda akan menemukan beberapa posting di Unix & Linux tentang PSS dan smapsfile jika Anda tertarik pada itu.

Tikar
sumber