Как многие считают, в 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
В поле 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. Иногда это может помочь вернуть отзывчивость системы без перезагрузок.