Материал просмотрен 953 раз(а)

Всем привет! Очередная статья ни о чём 😉 Шучу… Надеюсь, кому-то это поможет.

Предыстория

Внезапно, после того, как я совершенно ничего не делал на виртуальном сервере, стали приходить уведомления от хостера о недостатке свободной виртуальной памяти и завершении некоторых процессов. Печально осознавать, но это был apache. То есть кильнулся один из процессов, конечно на доступность сайта это не сильно повлияло, оставшиеся процессы могут легко обслужить большое количество клиентов, да и процесс вновь создастся, когда память немного освободится. Но тревожный звоночек прозвучал. А потом ещё раз. Совсем поплохело, когда эти “звоночки” начали звенеть в день раз по 5. Тогда я решил что-то исправить.

Удаляем ненужные приложения

Вот снимок вывода утилиты top:

Использование памяти

Использование памяти

Свободно виртуальной памяти 56 мегабайт. Позднее это число уменьшалось до 11, а потом и до 2… пока не был убит очередной процесс Apache2, пожиравший под 60 мегабайт памяти.

Посмотрел на вывод команды (выше) и понял, что можно освободить немного памяти, удалив ненужные сервисы. Как, например, Samba, лишняя дыра в безопасности, ведь я ей не пользуюсь. А поедает вон, почти 25 мегабайт.

# apt-get remove samba

Стало дышаться чуть полегче, но надолго это не помогло. Можно удалить и другие неиспользуемые сервисы.

Уменьшаем размер стека новых процессов

Технология виртуализации OpenVZ  ограничивает именно виртуальную память, в отличае от Xen, поэтому можно немного уменьшить объем адресуемой приложениями памяти по-умолчанию.

Для этого идём в /etc/init.d/rc и прописываем ближе к верху строчку:

ulimit -s 1024

что устанавливает размер стека для вновь создаваемых процессов на 1024 Кб (по умолчанию же, можно набрав ulimit -s, получить 8196 Кб), этого вполне достаточно для любых рабочих приложений.

Так же можно подправить файл /etc/security/limits.conf (изучив внутреннюю документацию). Я дописал там строчки:

* soft stack 1024
* hard stack 1024

что в принципе должно продублировать ulimit -s 1024, чтож, перезагружаем сервер и видим немного больший прирост памяти, но которая вновь постепенно исчерпывается.

Идём дальше.

Разделяем нагрузку между веб-серверами

Я поставил фронтэндом nginx, который отдает статику (картинки, файлы), намного быстрее апача, да и памяти кушает намного меньше. На бэкэнде оставил апач на другом порту, чтобы nginx проксировал до этого сервиса остальные запросы.

При этом в конфиге апача можно подправить:

KeepAlive Off

так как он стоит в бэкэнде и нет смысла держать открытые подключения продолжительное время.

Удаляем модули Apache

Теперь пришло время немного умерить аппетиты самого Апача, который потреблял львиную долю памяти.

Смотрим, какие модули у нас есть:

#apache2ctl -M

Модули Апача

Модули Апача

покажет модули static (с которыми скомпилирован) и shared (подключенные);

выполняем:

#a2dismod <имя_модуля>

для тех, которые решаем отключить. Уверен, что многое из того, что подключено – вам не нужно вовсе. Некоторые модули таким образом не удаляются, поэтому просто можно удалить символическую ссылку из /etc/apache2/mods-enabled/ и перезапустить апач

#/etc/init.d/apache2 restart

Эти модули я отключил у себя

negotiation
reqtimeout
mod_perfomance
autoindex

Далее, поскольку у нас есть mpm_prefork_module, грех не воспользоваться тонкой настройкой его.

Prefork

Prefork

Это в конфиге /etc/apache2/apache2.conf

Что значат эти цифры?

Стартует 1 сервис. Когда посыпятся запросы, максимально может быть запущено 8 процессов apache2 для разруливания пользовательских запросов, которое потом снизится до одного, когда нечего будет делать. То есть MaxSpare и MinSpare – количество процессов, которые ничего не делают, соответственно максимальное и минимальное их количество.

Сервер вздохнул посвободнее:

Потребление памяти

Потребление памяти

Если посещаемость VPS вырастет ещё, придется немного изменять эти цифры, подстраивать под оптимальное значение. А то я уж чуть было не купил другой тариф, посвободнее. Хотя не все ещё выжал из этого! Надеюсь, кому-нибудь окажется полезным.