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?
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?
Risposte:
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
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.
/proc/*/map
file, 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.