Come misurare la memoria senza pagine copy-on-write?


8

Come si può misurare la memoria RSS totale occupata da un insieme di processi (biforcati), senza contare due volte le pagine condivise e copia su scrittura?


1
Domanda molto interessante, +1: dovrebbe essere possibile un'analisi più approfondita dei /proc/*/mapfile, nonostante non abbia mai trovato uno strumento in grado di farlo. Il problema principale è che le strutture di dati da seguire sono molto più complesse come sembrano. Se non trovi una buona risposta qui, potresti provare anche unix SE.
Peter - Ripristina Monica il

Risposte:


4

Ho finito per scrivere la mia utility per questo: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca

L'ho eseguito contro init(pid 1) per i test e il totale riportato è approssimativamente uguale all'uso fisico della RAM (come per htop), quindi immagino che sia in qualche modo corretto.

Esempio di utilizzo:

~ » 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

2

Non esiste un modo chiaramente definito per determinare in qualsiasi strumento che conosco quali processi condividano quali mappe senza iterare attraverso tutte le mappature e confrontare gli indirizzi.

Tuttavia, Linux offre una stima ragionevole nota come dimensione dell'insieme proporzionale . Questo è riportato in / proc / [pid]> / maps.

Questo valore è la dimensione della mappatura divisa per il numero di fratelli / processi padre con la stessa mappatura aperta.

Quindi, con un programma che ha una mappatura di 1 MiB aperto, più un 1 MiB condiviso con altri 4 processi, la dimensione del set proporzionale è 1 MiB + (1 Mb / 4) o 1.250 MiB. L'RSS in questo caso sarebbe 2 MiB.

Esiste una patch per htop fluttuante che utilizzerà il PSS per calcolare una "buona stima" della memoria effettiva in uso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.