Решаем проблемы производительности.
Исходные данные.
Транслируем футбольные матчи через интернет. Посетителей: в обычные дни 5 000 — 10 000, в дни матчей 100 000 — 150 000.
В дата-центре
Проблема
При большом наплыве посетителей происходит перегрузка локальной сети из-за большого количества обращений к мемкешу. Усугублящие факторы: 100Мбит сеть, оба пула на одних и тех же серверах.
Решения
Вот сегодня речь и пойдёт о технологии умных сессий, которая была нами применена для снижения нагрузки.
В самом деле, сайт у нас платный, даже если у нас 150 000 уникальных в сутки, то людей готовых заплатить реально мало. Посетители распределяются примерно следующим образом:
Поскольку у нас используется мемкеш, то у нас уже есть объект Session, который перегружает стандартный функционал сессий и позволяет хранить последнии в мемкеше. Дополнительно мы делаем следующее:
Вуаля, частично нагрузка на сеть снижена, на мемкеш тоже. Затем переключили кеширование части блоков на локальные веб-серваки и смогли безболезненно дождаться спада посетителей, после чего увеличили пропускную способность сети.
Коментарии приветствуются.
UPD: Суть поста показать не какой я крутой, а в том, что в ПХП есть мелочи настолько обыденные, что мы перестаём обращать на них внимание, а ведь иногда они не слишком продуманы и оказывают влияние на производительность.
Исходные данные.
Транслируем футбольные матчи через интернет. Посетителей: в обычные дни 5 000 — 10 000, в дни матчей 100 000 — 150 000.
В дата-центре
- 5 веб-серверов с апачем и ПХП, наружу вывешены через аппаратный балансировщик загрузки
- 2 пула мемкеша: для сессий и данных из веб-сервисов
Проблема
При большом наплыве посетителей происходит перегрузка локальной сети из-за большого количества обращений к мемкешу. Усугублящие факторы: 100Мбит сеть, оба пула на одних и тех же серверах.
Решения
- Наращивание сети до 1Гбит после окончания серии матчей
- Увеличение времени хранения кеша (как временная мера)
- Использование технологии умных сессий
Вот сегодня речь и пойдёт о технологии умных сессий, которая была нами применена для снижения нагрузки.
В чём суть технологии
- Мы не создаём сессию, если она реально не нужна.
- Мы не обновляем сессию в хранилище, если она не изменилась.
В самом деле, сайт у нас платный, даже если у нас 150 000 уникальных в сутки, то людей готовых заплатить реально мало. Посетители распределяются примерно следующим образом:
- 70% — Зеваки. Открыли главную страницу, поняли что не то, что нужно, закрыли. То есть SЕО поработал хорошо, а нам разгребай.
- 28% — Фанаты. Денег нет, но пользуются нашим сайтом, чтобы следить за информация по ходу матча (голы, замены). Обычно не регистрируются, ибо информация доступна и так.
- 2% — Реально смотрят матчи, зарегистрировавшись и заплатив.
Реализация
Поскольку у нас используется мемкеш, то у нас уже есть объект Session, который перегружает стандартный функционал сессий и позволяет хранить последнии в мемкеше. Дополнительно мы делаем следующее:
- Глобальный session_start() помещаем в if, чтобы сессия не создавалась, когда не просят.
if(!empty($_COOKIE[ini_get('session.name')]))
session_start();
- В месте, где пользователя логиним добавляем старт сессии, ибо здесь уже надо:
if(empty($_COOKIE[ini_get('session.name')]))
session_start();
- И наконец в нашем объекте создаём дополнительную статическую переменую, где храним содержимое сессии при чтении, а при записи делаем следующую проверку в самом начале:
if(self::$data !== null && self::$data == $currentData)
return strlen($currentData);
Вуаля, частично нагрузка на сеть снижена, на мемкеш тоже. Затем переключили кеширование части блоков на локальные веб-серваки и смогли безболезненно дождаться спада посетителей, после чего увеличили пропускную способность сети.
Коментарии приветствуются.
UPD: Суть поста показать не какой я крутой, а в том, что в ПХП есть мелочи настолько обыденные, что мы перестаём обращать на них внимание, а ведь иногда они не слишком продуманы и оказывают влияние на производительность.