Ubuntu Linux: Przetwarzaj pamięć wymiany i zużycie pamięci


14

Moje Ubuntu zjada więcej pamięci niż pokazuje menedżer zadań:

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

To jest dziwne. Czy ktoś może wyjaśnić tę różnicę?

Ale co ważniejsze: chciałbym wiedzieć, ile pamięci tak naprawdę wykorzystuje proces. Nie chcę znać wielkości pamięci wirtualnej, ale raczej pamięć rezydentna plus zamiana procesu.

Próbowałem również wypisać format param „sz” z „ps”, ale suma tego jest wysoka (16000 MB) (param „size” daje 36700 MB). Są jakieś inne opcje?

Naprawdę chcę tego użyć, aby ustalić, które programy / procesy jedzą zbyt dużo pamięci (i zamiany), aby je zabić, ponieważ pamięć jest cenna :-) To po prostu nie ma sensu, więc pytam tutaj.

Wyjście / 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

Powinienem zauważyć, że „1043.84” nie jest bardzo dalekie od „1178”, czyli liczby, którą otrzymacie w obliczeniach, które przeprowadzacie.
cjc

Miałem dosłownie identyczne pytanie na unix.stackexchange (+1). Patrick też tam oszalał: P-- unix.stackexchange.com/questions/34795/…
GoldenNewby

Odpowiedzi:


10

System wirtualnej pamięci linux nie jest taki prosty. Nie możesz po prostu zsumować wszystkich pól RSS i otrzymać wartości zgłoszonej usedprzez free. Jest wiele powodów, ale trafię na kilka największych.

  • Gdy proces rozwiąże się, zarówno rodzic, jak i dziecko będą wyświetlać ten sam kanał RSS. Jednak Linux używa copy-on-writetak, że oba procesy naprawdę wykorzystują tę samą pamięć. Tylko wtedy, gdy jeden z procesów zmodyfikuje pamięć, zostanie ona faktycznie skopiowana. To spowoduje, że freeliczba będzie mniejsza niż topsuma RSS.

  • Wartość RSS nie obejmuje pamięci współdzielonej. Ponieważ pamięć współdzielona nie jest własnością żadnego procesu, topnie zawiera jej w RSS. To spowoduje, że freeliczba będzie większa niż topsuma RSS.


Och dziękuje! Zawsze myślałem, że free -m pokazuje rzeczywistą sumę pamięci współużytkowanej całego systemu. Ale jak wskazuje „man ps”: „Kolumna pamięci wspólnej powinna zostać zignorowana; jest przestarzała”.
David Halter,

Niestety nie mogę zaakceptować tej odpowiedzi, ponieważ nie rozwiązuje ona problemu wymiany, ale i tak dziękuję!
David Halter,

@DavidHalter jaki problem wymiany? Podane przeze mnie informacje dotyczą całej pamięci, w tym wymiany.
Patrick

pamięć współdzielona nie jest tak naprawdę duża? Przynajmniej tak widziałem w menedżerze zadań. Ale moja zamiana jest dość intensywnie używana: 1035 MB; Suma PS wynosi 1 GB, a suma swap + rss wynosi> 2 GB. Chcę zobaczyć, ile pamięci tak naprawdę używa proces, a nie tylko rss. Jeszcze bardziej interesujące byłoby to, ile pamięci zamienia proces zużywa.
David Halter,

1
@DavidHalter, jeśli chcesz zobaczyć, ile pamięci zajmuje proces (w tym współdzielony), spójrz na kolumnę „VSZ”.
Patrick

1

Myślę, że lepiej jest ufać wyjściu „darmowego”, jeśli chodzi o całkowite wykorzystanie pamięci, i ufać „ps”, jeśli chodzi o ogólne pojęcie, ile pamięci zajmuje pojedynczy proces.

Tylko dlatego, że suma wartości „ps” RSS nie jest równa „wolna”, nie powstrzymuje cię przed sortowaniem procesów według RSS i oceną największych pod kątem zabijania.

Biorąc to pod uwagę, jeśli cały twój wysiłek służy tylko upewnieniu się, że maszyna może hibernować, tworzenie większej liczby wymian (w postaci pliku na dysku, jeśli to konieczne) jest prawdopodobnie łatwiejszą ścieżką.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.