Назад | Перейти на главную страницу

Ubuntu Linux: память процесса подкачки и использование памяти

Моя 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 и оценивать самые большие из них на предмет уничтожения.

При этом, если все ваши усилия направлены только на то, чтобы машина могла перейти в спящий режим, создание большего объема подкачки (в виде файла на диске, если необходимо), вероятно, является более простым путем.