Моя Ubuntu потребляет больше памяти, чем показывает диспетчер задач:
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
Это странно. Может кто-нибудь объяснить эту разницу?
Но что более важно: я хотел бы знать, сколько памяти действительно использует процесс. Я не хочу знать размер виртуальной памяти, а скорее резидентную память плюс подкачку процесса.
Я также попытался вывести параметр формата «sz» из «ps», но его сумма слишком высока (16000 МБ) (параметр «размер» дает 36700 МБ). Есть ли другие варианты?
Я действительно хочу использовать это, чтобы определить, какие программы / процессы потребляют много памяти (и подкачки), чтобы убить их, потому что память ценна :-) Это действительно не имеет смысла, поэтому я спрашиваю здесь.
Вывод / 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
Система виртуальной памяти Linux не так проста. Вы не можете просто сложить все поля RSS и получить отчетное значение used
по free
. Для этого есть много причин, но я выделю пару самых важных.
Когда процесс разветвляется, и родитель, и потомок будут отображаться с одним и тем же RSS. Однако Linux использует copy-on-write
так что оба процесса действительно используют одну и ту же память. Только когда один из процессов изменяет память, она действительно дублируется. Так что это вызовет free
число должно быть меньше, чем top
RSS сумма.
Значение RSS не включает общую память. Поскольку общая память не принадлежит ни одному процессу, top
не включает его в RSS. Так что это вызовет free
число должно быть больше, чем top
RSS сумма.
Наконец-то я получил ответ на свой вопрос. Есть программа под названием smem (в Ubuntu / Debian apt install smem
), который позволяет отдельно перечислять своп и используемую память.
Здесь можно найти несколько различных способов обмена листингами: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/.
Я думаю, вам лучше доверять выводу «free» в отношении общего использования памяти и доверять «ps» для общего представления о том, сколько памяти использует один процесс.
Тот факт, что сумма значений RSS «ps» не равна «свободному», не мешает вам сортировать процессы по RSS и оценивать самые большие из них на предмет уничтожения.
При этом, если все ваши усилия направлены только на то, чтобы машина могла перейти в спящий режим, создание большего объема подкачки (в виде файла на диске, если необходимо), вероятно, является более простым путем.