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' - это то, что не получает файл, поддерживающий его - как ваши отображения.