Linux: память процесса учитывается в кэшированном объеме

У меня очень странный случай использования памяти на нашем сервере Ubuntu. Один процесс (который ищется из sphinxsearch) выделил почти всю доступную память, а его VSize, RSS и SHR почти равны (около 18 ГБ). Но что меня действительно удивляет, так это то, что команда free обрабатывает большую часть этой памяти как "кэшированный" - который я всегда считал "принадлежащим ядру", то есть - не привязанный к конкретному процессу. Кроме того, в то же время он помечен как "общий", хотя нет других процессов с таким высоким использованием памяти.

Итак, free -h показывает:

root@st3:/proc/31633# free -h
             total       used       free     shared    buffers     cached
Mem:           23G        22G       649M        18G        62M        18G
-/+ buffers/cache:       4.4G        19G
Swap:           0B         0B         0B

Но для процесса searchd мы имеем:

VmPeak: 20451512 kB
VmSize: 20413352 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:  20325488 kB
VmRSS:  20287332 kB
VmData:  1344768 kB
VmStk:       136 kB
VmExe:      4268 kB
VmLib:     16204 kB
VmPTE:     39924 kB
VmSwap:        0 kB

Так что я не могу по-настоящему понять, что такое реальное использование здесь - кажется, что большая часть памяти используется только для кеширования, поэтому это не должно вызывать беспокойства, OTOH мы уже столкнулись с несколькими сбоями с "Cannot распределять память" для простого fork, поэтому вот почему я пытаюсь это понять.

Если вы хотите больше, вот полное напоминание от этой машины, а вот searchd обрабатывать полный список отображений памяти.

И, глядя на последний, я вижу много:

7f7c905b7000-7f7c90713000 rw-s 00000000 00:05 226801755                  /dev/zero (deleted)
7f7c90713000-7f7c91fff000 rw-s 00000000 00:05 225400928                  /dev/zero (deleted)
7f7c92055000-7f7c921c7000 rw-s 00000000 00:05 226767567                  /dev/zero (deleted)
7f7c921da000-7f7c92338000 rw-s 00000000 00:05 226774289                  /dev/zero (deleted)

... так что я могу только догадываться, что в этом может быть смысл, что searchd делает некоторые хитрые трюки, чтобы сохранить память, но в то же самое время она доступна для системы, когда это необходимо. И возможно это не полностью работает, как ожидалось. Но это только мое дикое предположение, и я могу ошибаться здесь.

1 ответ

Решение

Запись "Cached" считает количество страниц, помеченных как "общие". Данные сопоставления помечены как общие.

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

Тот факт, что это подтверждается /dev/zero, несущественен. Причиной их совместного использования является почти наверняка, потому что одни и те же данные памяти должны быть доступны для всех дочерних процессов, которые изменяют данные.

С точки зрения семантики он ведет себя как нормально выделенная память (или анонимная память), учитывая, что на самом деле нет пригодного для использования файла, в который можно выгружать страницы (/dev/zero - это не совсем файл, в который вы можете сохранить), и страницы будут перемещены в поменяйте местами, если они не использовались.

Таким образом, - сбивает с толку - данные считаются "кэшированными", но фактически обрабатываются как память с анонимным резервированием.

Вы можете видеть, что это именно то, что происходит в вашем meminfo:

root@st3:/proc/31633# cat /proc/meminfo 
MemTotal:       24690512 kB
...
Cached:         19504260 kB
...
Active(anon):    3734376 kB
Inactive(anon): 18973184 kB
Active(file):     227128 kB
Inactive(file):   365828 kB
...
Mapped:         19237684 kB
Shmem:          18985464 kB
...

То же самое происходит, если вы используете разделяемую память IPC тоже.

'file' на самом деле - это то, что поддерживает файл, 'anon' - это то, что не получает файл, поддерживающий его - как ваши отображения.

Другие вопросы по тегам