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
Odpowiedzi:
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
used
przezfree
. 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-write
tak, że oba procesy naprawdę wykorzystują tę samą pamięć. Tylko wtedy, gdy jeden z procesów zmodyfikuje pamięć, zostanie ona faktycznie skopiowana. To spowoduje, żefree
liczba będzie mniejsza niżtop
suma RSS.Wartość RSS nie obejmuje pamięci współdzielonej. Ponieważ pamięć współdzielona nie jest własnością żadnego procesu,
top
nie zawiera jej w RSS. To spowoduje, żefree
liczba będzie większa niżtop
suma RSS.źródło
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ą.
źródło
W końcu dostałem odpowiedź na moje pytanie. Istnieje program o nazwie smem (na Ubuntu / Debian
apt install smem
), który pozwala na osobne wyświetlanie zamiany i używanej pamięci.Kilka różnych sposobów zamiany list można znaleźć tutaj: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ .
źródło