development on the knee by vladimir khramtsov

33
Разработка на коленке История оптимизации двух маленьких проектов

Upload: php-user-group-minsk

Post on 24-May-2015

226 views

Category:

Technology


3 download

DESCRIPTION

Презентация Владимира Храмцова к докладу про оптимизацию двух маленьких PHP проектов. Основыне тезисы: что происходит, когда увеличивается нагрузка, какие возникают проблемы и способы их решения.

TRANSCRIPT

Page 1: Development on the Knee by Vladimir Khramtsov

Разработка на коленке

История оптимизации двух маленьких проектов

Page 2: Development on the Knee by Vladimir Khramtsov

А давайте напишем маленький скрипт

• Пользователю могут выдаваться очки

• Очки можно поменять на бонус

• Возможность посмотреть баланс

• Нет баланса – нет учетки

• Ответы реализованы в виде http codes (вроде как REST)

Page 3: Development on the Knee by Vladimir Khramtsov

LAMP

• PHP

• Apache (mod_php, mod_rewrite)

• MySQL (куда же без него)

Page 4: Development on the Knee by Vladimir Khramtsov

Выгрузились,запустились,

всё работает, клиенты ходят,

данные передаются

Page 5: Development on the Knee by Vladimir Khramtsov

Первая проблема

• Возрастает количество клиентов и MySQL начинает потреблять всё больше процессорных ресурсов, хотя slow query log пустой.

• Проблема в частых запросах к маленькой табличке. Запросы выполняются быстро (менее 1 секунды), но нагружается процессор.

Page 6: Development on the Knee by Vladimir Khramtsov

Но ненадолго

Page 7: Development on the Knee by Vladimir Khramtsov

Выгрузка нового билда мобильного приложения

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

• Клиентов достаточно много, получаем DDOS атаку.

Page 8: Development on the Knee by Vladimir Khramtsov

Основные проблемы

• MySQL начинает сбрасывать соединения.

• Apache начинает проявлять прибалтийские кооорни.

Page 9: Development on the Knee by Vladimir Khramtsov

Пути решения

• Увеличение мощности сервера

• Кэширование (memcached).

• Изменяем порядок обработки запросов на php

Page 10: Development on the Knee by Vladimir Khramtsov

Увеличение мощности сервера

• Поскольку дело было на Amazon, увеличение мощности произошло с помощью одного клика мыши.

Page 11: Development on the Knee by Vladimir Khramtsov

Кэширование

• Самым частым запросом оказался запрос на получение учетной записи клиента. Однако для большинства запросов учеток не было. Пришлось кэшировать в memcache все ответы.

• Данные о пользователях сохранялись по предсказуемым ключам.

• На MySQL Query Cache не рассчитывали

Page 12: Development on the Knee by Vladimir Khramtsov

Изменение порядка обработки запросов на php

• Поскольку apache все равно не выдерживал потока запросов, было принято решение заменить его на nginx+php-fpm (не только потому что его использовать круто, а apache нет)

• Установка APC

Page 13: Development on the Knee by Vladimir Khramtsov

Результаты

• Увеличение обслуживаемых rps больше чем в два раза

• Падение нагрузки на сервер

• 99.9% hits в memcache

• Снижение нагрузки на дисковую систему

• Нет ситуации с долгим ожиданием ответа

Page 14: Development on the Knee by Vladimir Khramtsov

Второй проект

• Сеть для показа рекламы

• Нужно было написать не маленький скрипт, а мини систему управления контентом.

• Клиенты делают запросы и тянут рекламу с сервера.

Page 15: Development on the Knee by Vladimir Khramtsov

Опять же Lamp

• PHP

• Apache

• MySQL

Page 16: Development on the Knee by Vladimir Khramtsov

Опять же всё написано, выгружено и вроде даже

стабильно работает, статистика пишется и все происходит в режиме реального времени

Page 17: Development on the Knee by Vladimir Khramtsov

Первые проблемы

• Подсчет статистики при показе списка

• Кэширование с пересчетом раз в полчаса

Page 18: Development on the Knee by Vladimir Khramtsov

Появление новых возможностей

• Новые типы рекламы по запросу• Начинаем собирать информацию о

пользователях ( взаимодействие с приложениями - клиентами )

• Добавление рассылок push notifications• Деление пользователей на группы• Возможность фокусирования всех

типов реклам на отдельного пользователя.

Page 19: Development on the Knee by Vladimir Khramtsov

И вдруг одно из мобильных приложений выводят в top и

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

производительностью серверной части

Page 20: Development on the Knee by Vladimir Khramtsov

Результаты вывода в top

• Много установленных приложений – много запросов к системе (К.О. или таки уже майор?)

• Приложения-будильники стартуют в одной часовой зоне практически одновременно (разбежка часов очень небольшая)

• Apache забивается запросами статики

Page 21: Development on the Knee by Vladimir Khramtsov

Что применялось

• Nginx

• Memcached

• Изменения в исходном коде

• APC

Page 22: Development on the Knee by Vladimir Khramtsov

Nginx

• Отдача статики для всех проектов на данном сервере

• Обратное проксирование

Page 23: Development on the Knee by Vladimir Khramtsov

Memcached

• Компромисс между мгновенным отражением изменений данных и производительностью системы.

• Кэширование редко изменяющихся данных

Page 24: Development on the Knee by Vladimir Khramtsov

Изменения в исходном коде

• Проверка некоторых условий на актуальность до главного запроса

• Изменение кода для избежания deadlocks в MySQL.

Page 25: Development on the Knee by Vladimir Khramtsov

Результаты

• Улучшение производительности, т.к. На отдачу статики не расходуются ресурсы apache

• Улучшение ситуации при работе с медленными клиентами.

• Снижение нагрузки на MySQL.

Page 26: Development on the Knee by Vladimir Khramtsov

Общие рекомендации

Page 27: Development on the Knee by Vladimir Khramtsov

Отделение часто изменяемых данных, от тех данных, которые

меняются редко. В частности это упрощает создание эффективной системы кэширования. Например

отделение информации о пользователе от его баланса

Page 28: Development on the Knee by Vladimir Khramtsov

Для упрощения поддержания кэша в адекватном состоянии

стоит использовать предсказуемые ключи,

например для пользователя userdata_{id}

Page 29: Development on the Knee by Vladimir Khramtsov

В некоторых случаях можно отражать изменения с некоторой

задержкой

Page 30: Development on the Knee by Vladimir Khramtsov

Кэширование не должно использоваться как костыль для

решения проблем приложения (а иногда так хочется).

Page 31: Development on the Knee by Vladimir Khramtsov

В первую очередь кэширование стоит применять для данных,

которые редко меняются.MySQL query cache vs

кэширование на стороне приложения.

Page 32: Development on the Knee by Vladimir Khramtsov

Как правило, при кэшировании всегда доступна операция delete.

Page 33: Development on the Knee by Vladimir Khramtsov

В некоторых случаях имеет смысл использовать постоянные

соединения (persistent connections), однако надо

помнить, что некоторые модули чистят состояние соединения

(mysqli), а некоторые – нет (PDO).