Copia/incolla spudoratamente la mia risposta da serverfault proprio l'altro giorno :-)
Il sistema di memoria virtuale di Linux non è così semplice. Non puoi semplicemente sommare tutti i campi RSS e ottenere il valore riportato used
da free
. Ci sono molte ragioni per questo, ma citerò un paio delle più importanti.
-
Quando un processo esegue il fork, sia il genitore che il figlio verranno visualizzati con lo stesso RSS. Tuttavia Linux utilizza la copia su scrittura in modo che entrambi i processi utilizzino realmente la stessa memoria. Solo quando uno dei processi modifica la memoria verrà effettivamente duplicato.
Ciò causerà ilfree
numero inferiore atop
Somma RSS. -
Il valore RSS non include la memoria condivisa. Poiché la memoria condivisa non è di proprietà di nessun processo,
top
non lo include in RSS.
Ciò causerà ilfree
numero maggiore ditop
Somma RSS.
Se stai cercando numeri di memoria che si sommano dai un'occhiata a smem:
smem è uno strumento che può fornire numerosi rapporti sull'utilizzo della memoria sui sistemi Linux. A differenza degli strumenti esistenti, smem può segnalare la dimensione del set proporzionale (PSS), che è una rappresentazione più significativa della quantità di memoria utilizzata da librerie e applicazioni in un sistema di memoria virtuale.
Poiché grandi porzioni di memoria fisica sono in genere condivise tra più applicazioni, la misura standard dell'utilizzo della memoria nota come RSS (resident set size) sovrastimerà notevolmente l'utilizzo della memoria. PSS invece misura la "quota equa" di ciascuna applicazione di ciascuna area condivisa per fornire una misura realistica.
Ad esempio qui:
# smem -t
PID User Command Swap USS PSS RSS
...
10593 root /usr/lib/chromium-browser/c 0 22868 26439 49364
11500 root /usr/lib/chromium-browser/c 0 22612 26486 49732
10474 browser /usr/lib/chromium-browser/c 0 39232 43806 61560
7777 user /usr/lib/thunderbird/thunde 0 89652 91118 102756
-------------------------------------------------------------------------------
118 4 40364 594228 653873 1153092
Quindi PSS
è la colonna interessante qui perché tiene conto della memoria condivisa.
A differenza di RSS
ha senso sommarlo. Qui otteniamo 654 Mb totali per i processi userland.
L'output a livello di sistema racconta il resto:
# smem -tw
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 345784 297092 48692
userspace memory 654056 181076 472980
free memory 15828 15828 0
----------------------------------------------------------
1015668 493996 521672
Quindi 1Gb RAM totale =654Mb processi in area utente + 346Mb memoria del kernel + 16 Mb gratis
(più o meno qualche Mb)
Complessivamente circa la metà della memoria è utilizzata per la cache (494Mb).
Domanda bonus :cos'è la cache userland rispetto alla cache del kernel qui?
btw per qualcosa di visivo prova:
# smem --pie=name
Un ottimo strumento è pmap
che elenca l'uso corrente della memoria per un determinato processo:
pmap -d PID
Per ulteriori informazioni su di esso vedere la pagina man man pmap
e dai anche un'occhiata a 20 strumenti di monitoraggio del sistema Linux che ogni amministratore di sistema dovrebbe conoscere, che elencano ottimi strumenti che utilizzo sempre per ottenere informazioni sulla mia macchina Linux.