Уменьшаем потребление оперативной памяти на VPS

Тема еще тот баян-бабаян, но я оставлю эту запись здесь, чтобы потом не забыть, как что делать :-)

Подобная заметка появилась на Хабре еще в 2009 году. В заголовке статьи утверждалось о снижении потребления памяти в 2 раза. Подтвердить такое снижение я не могу, но небольшой эффект 10-20% вроде бы есть.

Итак, что мы имеем:

На каждый запущенный тред в виртуальной памяти выделяется место под стек. По умолчанию это место = 10М. Берем какой-нибудь apache с mpm_worker (который создает кучу тредов), запускаем под OpenVZ — тратятся сотни мегабайт памяти.

Это весьма много. Будем резать.

Уменьшить размер стека по умолчанию можно командой ulimit -s <размер стека на тред в Кб>. Параметр меняется для программ, запущенных из текущего шелла (ну иерархически тоже ессно). Запускаем эту штуку при загрузке системы (внутри скрипта, стартующего демоны) — и все.

Чтобы это сделать, нужно вписать строку ulimit -s 1024 в файл /etc/rc в самый верх. etc/rc — это симлинк и в CentOS, например, сам файл находится в директории /etc/rc.d. Некоторые «советчики» рекомендуют править файл rc.local, но этот совет — галимое плацебо, rc.local запускается в самом конце и никак не поможет делу…

Еще советуют выставлять лимиты в /etc/security/limits.conf. В принципе, как вариант, но лениво :-)

Для тестирования всего этого дела, если боязно лезть сразу в /etc/rc, можете 

  1.  посмотреть, сколько занимает в памяти какой-нибудь процесс
  2.  в шелле ввести ulimit -s <сколько-нибудь, в килобайтах>
  3.  перезапустить процесс (что-нибудь в духе /etc/init.d/mysql restart)
  4.  посмотреть еще раз, сколько теперь занимает, и проверить, что все работает

Вообще ulimit предназначен для контроля ресурсов и может ограничивать не только размер стека.

Рассмотрим использование ulimit на примере ограничений пользователя worker

Добавим в конец /etc/profile:

  1. if [ "$USER" = "worker" ]; then
  2.  
  3.    ulimit -c 0 # Запрещаем создавать core файлы
  4.    ulimit -d 48000 # Ограничиваем максимальный размер сегмента данных в 48 MB
  5.    ulimit -s 8192  # Ограничиваем максимальный размер стэка в 8 MB
  6.    ulimit -m 48000 # Ограничиваем максимальный размер резидентной части процесса (находящейся в ОЗУ) в 48 MB
  7.    ulimit -u 64    # Ограничиваем максимальное число запущенных этим пользователем процессов.
  8.    ulimit -n 128   # Ограничиваем максимальное число открытых файлов.
  9.    ulimit -f 100000 # Ограничиваем максимальный размер создаваемого файла в 100 MB
  10.    ulimit -v 100000 # Ограничиваем максимальный размер используемой виртуальной памяти в 100 MB
  11.  
  12. fi

Для просмотра текущих установок нужно набрать ulimit -a

Теги: