Bagaimana mengukur memori tanpa halaman copy-on-write?

8

Bagaimana seseorang dapat mengukur total memori RSS yang ditempati oleh serangkaian proses (bercabang), tanpa penghitungan ganda halaman yang dibagi dan disalin?

Eugene Pankov
sumber
1
Pertanyaan yang sangat menarik, +1 - ini seharusnya dapat dilakukan dengan menganalisis /proc/*/mapfile lebih dalam, meskipun saya tidak pernah menemukan alat yang bisa melakukan itu. Masalah utama adalah bahwa struktur data yang harus diikuti jauh lebih kompleks. Jika Anda tidak mendapatkan jawaban yang bagus di sini, mungkin Anda dapat mencoba unix SE juga.
peterh

Jawaban:

4

Saya akhirnya menulis utilitas saya sendiri untuk ini: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca

Saya menjalankannya terhadap init(pid 1) untuk pengujian dan total yang dilaporkan kira-kira sama dengan penggunaan ram fisik (seperti per htop), jadi saya kira itu agak benar.

Contoh penggunaan:

~ » pstree -ap 15897
zsh,15897
  └─sudo,9783 make rundev
      └─make,9784 rundev
          └─sh,9785 -c cd ajenti-panel && ./ajenti-panel -v --autologin --plugins ../plugins --dev
              └─python ./ajenti,9786
                  ├─./ajenti-panel ,9834                              
                  ├─./ajenti-panel ,9795                     
                  └─{python ./ajenti},9796

~ » sudo ./memuse.py 15897
PID                 Commandline                          Frames (+unique)           VMEM
 - 15897            (/usr/bin/zsh                  ):      1776  +1776           7104 KB
  -  9783           (sudo make rundev              ):       608  +408            2432 KB
   -  9784          (make rundev                   ):       261  +98             1044 KB
    -  9785         (/bin/sh -c cd ajenti-panel && ):       166  +48              664 KB
     -  9786        (python ./ajenti-panel -v --aut):      9279  +8977          37116 KB
      -  9795       (./ajenti-panel worker [restric):      7637  +1334          30548 KB
      -  9834       (./ajenti-panel worker [session):      8972  +2639          35888 KB
----------------------------------------------------------------------------------------
TOTAL:                                                    15280                 61120 KB
Eugene Pankov
sumber
2

Tidak ada cara yang jelas untuk menentukan dalam alat apa pun yang saya tahu proses mana yang berbagi peta mana tanpa mengulangi semua pemetaan dan membandingkan alamat.

Namun, linux memang menawarkan estimasi yang masuk akal yang dikenal sebagai ukuran set Proporsional . Ini dilaporkan di / proc / [pid]> / maps.

Nilai ini adalah ukuran pemetaan dibagi dengan jumlah proses saudara / orang tua dengan pemetaan yang sama terbuka.

Jadi, dengan program yang memiliki pemetaan 1MiB terbuka, ditambah 1MiB dibagi dengan 4 proses lainnya, ukuran set proporsional adalah 1MiB + (1Mib / 4) atau 1.250 MiB. RSS dalam hal ini adalah 2MiB.

Ada tambalan untuk htop mengambang di sekitar yang akan menggunakan PSS untuk menghitung 'perkiraan baik' dari memori aktual yang digunakan.

Matthew Ife
sumber