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

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

У меня очень странный случай использования памяти на нашем сервере ubuntu. Один процесс (который выполняется с помощью sphinxsearch) выделил почти всю доступную память, а его VSize, RSS и SHR почти равны (около 18 ГБ). Но что меня действительно удивляет, так это то, что эта команда 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 мы уже столкнулись с несколькими сбоями с «Невозможно выделить память» для простой вилки, поэтому вот почему я пытаюсь это понять.

Если хочешь большего, вот полная meminfo с этой машины, и здесь 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 делает некоторые хитрые трюки, чтобы сохранить память, но в то же время она доступна для системы, когда это необходимо. И, возможно, это не работает полностью, как ожидалось. Но это только мое безумное предположение, и здесь я могу ошибаться.

Запись «Кэшировано» подсчитывает количество страниц, помеченных как «общие». Указанные сопоставления помечены как общие.

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

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

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

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

Вы можете убедиться, что это именно так в вашем меминфо:

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.

«файл» на самом деле является тем, что файл поддерживается, «анон» - это то, что не имеет файла, поддерживающего его - как и ваши сопоставления.