Тема еще тот баян-бабаян, но я оставлю эту запись здесь, чтобы потом не забыть, как что делать :-)
Статьи Время чтения: 3 минуты Просмотров: 895
Тема еще тот баян-бабаян, но я оставлю эту запись здесь, чтобы потом не забыть, как что делать :-)
Подобная заметка появилась на Хабре еще в 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, можете
Вообще ulimit предназначен для контроля ресурсов и может ограничивать не только размер стека.
Рассмотрим использование ulimit на примере ограничений пользователя worker
Добавим в конец /etc/profile:
ulimit -c 0 # Запрещаем создавать core файлы
ulimit -d 48000 # Ограничиваем максимальный размер сегмента данных в 48 MB
ulimit -s 1024 # Ограничиваем максимальный размер стэка в 1 MB
ulimit -m 48000 # Ограничиваем максимальный размер резидентной части процесса (находящейся в ОЗУ) в 48 MB
ulimit -u 64 # Ограничиваем максимальное число запущенных этим пользователем процессов.
ulimit -n 128 # Ограничиваем максимальное число открытых файлов.
ulimit -f 100000 # Ограничиваем максимальный размер создаваемого файла в 100 MB
ulimit -v 100000 # Ограничиваем максимальный размер используемой виртуальной памяти в 100 MB
Для просмотра текущих установок нужно набрать ulimit -a
Статья актуальна для серверов с небольшим объемом оперативной памяти и когда Apache использует MPM модуль Prefork. Он используется по-умолчанию при установке Apache на CentOS 7. Проверить можно командой в консоли:
apachectl -t -D DUMP_MODULES |grep mpm
Вы должны увидеть mpm_prefork_module (shared)
Отредактируйте файл httpd.conf, добавьте в него нижеследующий код. Параметры сбалансированы для сервера с размером оперативной памяти 512 МБ:
KeepAlive Off
StartServers 2
MinSpareServers 6
MaxSpareServers 12
MaxClients 15
MaxRequestsPerChild 3000
В качестве альтернативного варианта этот код можно внести в отдельный файл с расширением .conf и сохранить его в директории /etc/httpd/conf.d. После внесения изменений в конфигурационные файлы не забудьте перезапустить вебсервер Apache:
apachectl restart