При большом количестве сайтов работающих на Mojolicious происходит эффект «засыпания» сайта. Этот эффект проявляется когда к сайту долгое время не обращаются, например 8-10 часов. Почему такое происходит и как решили проблему с «засыпанием» сайтов на Mojolicious рассказывается в этой статье.
В чем состоит проблема с «засыпанием» сайта на Mojolicious
При работе большого количества сайтов Mojolicious через Nginx на сервере начали наблюдать «падение» (прекращение работы) процессов hypnotoad или же наблюдали эффект длительного «просыпания» сайта, когда после простоя сайта 8-10часов или более, при попытке зайти на сайт открытие страницы в браузере занимало длительное время (2-3 минуты). Иногда сайт вообще мог не открыться, показывая сообщение «Bad gateway». При этом после повторного захода на сайт он открывался и начинал работать, а иногда также продолжал выдавать сообщение об ошибке «502 Bad Gateway».
Причины «засыпанием» сайта на Mojolicious
Основная причина оказалось в том, что процесс hypnotoad который работает постоянно и по существу являются веб-сервером, постоянно держит соединение с сервером баз данных MySQL.
При этом, для каждого сайта запускалось по 10 процессов, которые обеспечивали быструю работу сайта при посещении пользователями страниц сайта.
Пример конфигурации сайта sdep.ru.cms.conf
{
hypnotoad => {
listen => ["http://127.0.0.1:3001"] ,
workers => 10,
proxy => 1
}
};
В СУБД Mysql количество одновременно работающих соединений ограничено и настраивается в файлу конфигурации my.conf
Параметр max_user_connections отвечает за количество одновременных соединений от имени одного пользователя.
Так как все скрипты на Mojolicious работают под одним пользователем usermojo в MySQL то важен именно этот параметр.
В MySQL есть другой параметр max_connections но он указывает на количестов соединений всего.
Пример конфигурации my.conf
SET GLOBAL max_user_connections = 500;
SET GLOBAL max_connections = 500;
Установили 500 соединений для одного пользователя и 500 соединений всего.
Уменьшение потребления ресурсов сервера
Кроме увеличения количества разрешенный соединений для пользователя уменьшили количество соединений сайтами на Mojo и уменьшили количество потребляемых ресурсов – ведь каждый процесс hypnotoad забирает часть оперативной памяти и процессорного времени.
Пример оптимизированной конфигурации
{
hypnotoad => {
listen => ["http://127.0.0.1:3001"] ,
workers => 2,
proxy => 1
}
};
Видно что вместо 10 работающих процессов оставили только 2 процесса которые работают.
Заключение
Увеличением количества соединений к субд MySQL для одного пользователя (max_user_connections) и уменьшением потребляемых ресурсов которые требовались всем работающим процессам hypnotoad удалось высвободить ресурсы сервера и убрать эффект «засыпания» или падения процесса и увеличения количества сайтов работающих на связке Mojolicous + Nginx
Другой вариант – увеличение ресурсов сервера, то есть оперативной памяти, количества процессоров, жестких дисков – тоже возможный вариант но для дальнейшей оптимизации мы пошли другим путем – запустили сайты на Mojolicous в связке Mojolicous + Apache + Nginx
Читать
Конфигурирование Apache для запуска в продакшн Mojolicious
Mojolicious framework – запуск в продакшн на Apache
Конфигурирование Apache для правильной работы Mojolicious
Решение проблемы с «засыпанием» сайтов на Mojolicious