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

14

Моя 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
Дэвид Холтер
источник
Я должен отметить, что «1043.84» не очень далеко от «1178», то есть числа, которое вы получите, рассчитывая.
cjc
У меня был буквально одинаковый вопрос по unix.stackexchange (+1). Патрик тоже меня там поразил: P-- unix.stackexchange.com/questions/34795/…
GoldenNewby

Ответы:

10

Система виртуальной памяти Linux не так проста. Вы не можете просто сложить все RSS поля и получить значение , указанное usedна free. Для этого есть много причин, но я выберу пару самых важных.

  • Когда процесс разветвляется, родитель и потомок будут показывать один и тот же RSS. Однако в Linux используется copy-on-writeтак, что оба процесса действительно используют одну и ту же память. Только когда один из процессов модифицирует память, он будет фактически дублирован. Таким образом, это приведет к тому, что freeчисло будет меньше topсуммы RSS.

  • Значение RSS не включает общую память. Поскольку разделяемая память не принадлежит ни одному процессу, topне включает ее в RSS. Таким образом, это приведет к тому, что freeчисло будет больше topсуммы RSS.

Патрик
источник
О, спасибо! Я всегда думал, что free -m показывает фактическую сумму общей памяти всей системы. Но, как указывает «man ps»: «Столбец общей памяти следует игнорировать; он устарел».
Дэвид Холтер
Извините, я не могу принять этот ответ, потому что он не отвечает на проблему обмена, но все равно спасибо!
Дэвид Холтер
@DavidHalter, какая проблема с обменом? Предоставленная мною информация относится ко всей памяти, включая подкачку.
Патрик
общая память не очень большая, нормально? По крайней мере, это то, что я видел в диспетчере задач. Но мой своп довольно активно используется: 1035 МБ; Сумма PS составляет 1 ГБ, а сумма swap + rss> 2 ГБ. Я хочу посмотреть, сколько памяти реально использует процесс, а не только rss. Еще более интересным было бы то, сколько обменяемой памяти использует процесс.
Дэвид Холтер
1
@DavidHalter, если вы хотите увидеть, сколько памяти использует процесс (включая общую), посмотрите на столбец «VSZ».
Патрик
1

Я думаю, что вам лучше доверять выводу «free», насколько вам нужно общее использование памяти, и доверять «ps» для общего представления о том, сколько памяти использует один процесс.

Тот факт, что сумма значений RSS «ps» не равна «свободным», не мешает вам сортировать ваши процессы по RSS и оценивать самые большие из них для убийства.

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

datn
источник
1

Я наконец получил ответ на свой вопрос. Есть программа под названием smem (в Ubuntu / Debian apt install smem), которая позволяет вам перечислять подкачку и используемую память отдельно.

Несколько различных способов перечисления свопинга можно найти здесь: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ .

Дэвид Холтер
источник