CentOS 5,6: Утечка памяти в файловый кэш (Cached) или как освободить cached memory

archive view archive save

CentOS 5,6: Утечка памяти в файловый кэш (Cached) или как освободить cached memory Как многие считают, в CentOS существует проблема утечки памяти в файловый кэш (Cached) иначе говоря закэшированная (cached memory) память. На самом то деле утечка памяти в Cached файловый кэш, а вернее выделение памяти под файловый кэш является нормальным поведением ядра Linux.

Ядро Linux разработано для использования памяти максимально эффективным образом, поэтому на работающем десктопе или сервере почти вся память которая не используется отводится под дисковый кэш (cached), а при нехватке оперативной памяти (RAM) для приложений она будет взята обратно из cached. Пример значений утилиты top:

[root@localhost ~]# top
top - 16:49:27 up 15 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  82 total,   1 running,  81 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    244476k total,   156152k used,    88324k free,    16880k buffers
Swap:   709624k total,        0k used,   709624k free,    80572k cached

CentOS 5,6: Утечка памяти в файловый кэш (Cached) или как освободить cached memory В поле Mem: ... 88324k free видим 88 МВ доступной оперативной памяти (RAM), а в поле Swap: ... 80572k cached наблюдаем 80 МВ которые система выделила под обслуживание дискового КЭШа (Swap - своп). Как ранее упоминалось такой подход к распределению оперативной памяти является нормальным поведением ядра Linux, а если это кому-то ненравиться, то для освобождения закэшированной оперативной памяти в CentOS 5,6 можно воспользоваться приведённым ниже шел-скриптом:

cd /root/scripts
vi clmem
 
#!/bin/sh
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
 
chmod 700 clmem
./clmem
 
[root@localhost scripts]# top
top - 17:14:11 up 39 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  82 total,   1 running,  81 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    244476k total,    88172k used,   156304k free,     5728k buffers
Swap:   709624k total,        0k used,   709624k free,    28044k cached

Видим что из Swap: ... cached оперативка (RAM) перешла в Mem: ... free. Данные о распределении оперативной памяти можно получить командой free -m:

[root@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           238        169         68          0          0         17
-/+ buffers/cache:        151         86
Swap:          692          5        687

Если не удаётся освободить закэшированную оперативную память (RAM) с сообщением "Permission denied", то это может говорить о том, что либо эти манипуляции запрещены шаблоном системы виртуализации или же что-то с системой в целом, а скорее виноват шаблоном системы виртуализации по которому создавалась VPS, если команда выполняется на VPS:

[root@localhost scripts]# sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches'
sh: /proc/sys/vm/drop_caches: Permission denied

Так например при наличии веб-панели управления VPS, смена имени хоста внутри системы vi /etc/sysconfig/network не даст желаемого результата и после перезагрузки именя хоста останется старым - смену имени хоста в данном случае следует выполнять в веб-панели управления VPS!

Приведённый здесь способ очистки (освобождения) закэшированной оперативной памяти (RAM) применим не только к CentOS 5,6, а и к многим другим ОС на базе ядра Linux.

Более тонкую настройку использования памяти можно выполнить, но не рекомендуется, на уровне ядра Linux через sysctl, просмотреть всё касаемо использования памяти sysctl -a | grep mem, справка man sysctl.

Следует помнить, что выделение свободной памяти под файловый кэш является нормальным поведением ядра Linux!

Почему данные всё равно уходят в Swap если памяти хватает?

Данные всё равно уходят в Swap даже если оперативной памяти хватает но, заметьте, уходят в Swap не сразу, а спустя какое-то время, например это могут быть данные какого-то демона выполняющегося раз в несколько дней по расписанию.

Если Swap переполнится сервер упадёт?

Обычно Swap переполнить сложно! Устаревшие, мало востребованные данные будут удалены, а на их место будут записаны новые. Конечно всему есть предел - в редких случаях падения сервера, причиной может послужить аномально большое количество приложений непрерывно обрабатывающие аномально большое количество данных - в таком случае сервер конечно "ляжет".

Можно ли очистить Swap

Да, Swap можно очистить выполнив из под супер пользователя команду swapoff -a, при этом прекращается использование всех файлов подкачки. После выполнения команды содержимое Swap загружается обратно в оперативную память, а раздел подкачки отключается.

Откровенно говоря не скажу, что произойдёт если оперативной памяти не хватит но, вероятнее всего отключение Swap будет не возможно с выдачей сообщения "Невозможно выделить память".

После отключения Swap и загрузки содержимого Swap в оперативную память, снова включить Swap можно командой swapon -a. Иногда это может помочь вернуть отзывчивость системы без перезагрузок.

Ссылки по теме:

Автор: Олег Головский


Об авторе
АдМинь БагоИскатель
АдМинь БагоИскатель ярый борец за безглючную работу любых механизмов и организмов во всей вселенной и потому пребывает в вечном поиске всяческих багов, а тот кто ищет как известно всегда находит. Когда что-то или кого-то вылечить не в состоянии, то со словами "Я в аду, а вы все черти" уходит в запой выйдя из которого снова берётся лечить неизлечимое.
Ещё статьи автора
Комментарии в блоге
Новое на форуме