Ubuntu Linux: memoria di scambio di processo e utilizzo della memoria


14

Ubuntu consuma più memoria di quella mostrata dal task manager:

sudo ps -e --format rss  | awk 'BEGIN{c=0} {c+=$1} END{print c/1024}'
2750.29

free -m

             total       used       free     shared    buffers     cached
Mem:          3860       2765       1094          0          3        300
-/+ buffers/cache:       2461       1398
Swap:         2729       2374        354

È strano. Qualcuno può spiegare questa differenza?

Ma ciò che è più importante: mi piacerebbe sapere quanta memoria utilizza realmente un processo. Non voglio conoscere la dimensione della memoria virtuale, ma piuttosto la memoria residente più lo scambio di un processo.

Ho anche provato a produrre il formato param "sz" di "ps", ma la somma è troppo alta (16000 MB) (la "dimensione" del parametro dà 36700 MB). Ci sono altre opzioni?

Voglio davvero usare questo, per determinare quali programmi / processi stanno mangiando molta memoria (e scambiare), per ucciderli, perché la memoria è preziosa :-) Questo non ha davvero senso, quindi sto chiedendo qui.

Uscita di / proc / meminfo:

MemTotal:        3952812 kB                
MemFree:         1119192 kB
Buffers:            2676 kB
Cached:           290068 kB
SwapCached:       160980 kB
Active:          1805396 kB
Inactive:         731680 kB
Active(anon):    1745820 kB
Inactive(anon):   689184 kB
Active(file):      59576 kB
Inactive(file):    42496 kB
Unevictable:         148 kB
Mlocked:             148 kB
SwapTotal:       2795272 kB
SwapFree:         390900 kB
Dirty:              1984 kB
Writeback:             0 kB
AnonPages:       2085472 kB
Mapped:            67432 kB
Shmem:            190676 kB
Slab:              88012 kB
SReclaimable:      42704 kB
SUnreclaim:        45308 kB
KernelStack:        5496 kB
PageTables:        87860 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4771676 kB
Committed_AS:    9522364 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      374404 kB
VmallocChunk:   34359330144 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       61440 kB
DirectMap2M:     4030464 kB

Dovrei sottolineare che "1043,84" non è molto lontano da "1178", che è il numero che otterrai con quel calcolo che stai facendo.
cjc,

Avevo letteralmente la stessa domanda su unix.stackexchange (+1). Anche Patrick mi ha fatto impazzire: P-- unix.stackexchange.com/questions/34795/…
GoldenNewby

Risposte:


10

Il sistema di memoria virtuale Linux non è così semplice. Non puoi semplicemente sommare tutti i campi RSS e ottenere il valore riportato usedda free. Ci sono molte ragioni per questo, ma colpirò un paio di quelli più grandi.

  • Quando un processo esegue il fork, sia il genitore che il figlio mostreranno lo stesso RSS. Comunque Linux impiega in copy-on-writemodo che entrambi i processi stiano realmente usando la stessa memoria. Solo quando uno dei processi modifica la memoria verrà effettivamente duplicata. Pertanto, il freenumero sarà inferiore alla topsomma RSS.

  • Il valore RSS non include la memoria condivisa. Poiché la memoria condivisa non è di proprietà di alcun processo, topnon la include in RSS. Quindi questo farà sì che il freenumero sia maggiore della topsomma RSS.


Oh grazie! Ho sempre pensato che free -m mostra la somma effettiva della memoria condivisa dell'intero sistema. Ma come sottolinea "man ps": "La colonna della memoria condivisa dovrebbe essere ignorata; è obsoleta".
David Halter,

Siamo spiacenti, non posso accettare questa risposta, perché non risponde al problema di scambio, ma grazie comunque!
David Halter,

@DavidHalter quale problema di scambio? Le informazioni che ho fornito si applicano a tutta la memoria, incluso lo scambio.
Patrick,

la memoria condivisa non è molto grande, normalmente? Almeno questo è quello che ho visto nel task manager. Ma il mio swap è abbastanza usato: 1035 MB; La somma di PS è di 1 GB e la somma di swap + rss è> 2 GB. Voglio vedere quanta memoria utilizza davvero un processo, non solo rss. Ancora più interessante sarebbe la quantità di memoria scambiata utilizzata da un processo.
David Halter,

1
@DavidHalter se vuoi vedere quanta memoria utilizza un processo (incluso condiviso), quindi guarda la colonna 'VSZ'.
Patrick,

1

Penso che sia meglio fidarsi dell'output di "free" per quanto riguarda l'utilizzo totale della memoria e fidarsi di "ps" per avere un'idea generale della quantità di memoria utilizzata da un singolo processo.

Solo perché la somma dei valori RSS "ps" non equivale a "libero" non ti impedisce di ordinare i tuoi processi per RSS e di valutare quelli più grandi per l'uccisione.

Detto questo, se tutti i tuoi sforzi sono solo al servizio per assicurarti che la macchina possa ibernare, creare più swap (sotto forma di un file su disco, se necessario) è probabilmente un percorso più facile da prendere.


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.