development on the knee by vladimir khramtsov
DESCRIPTION
Презентация Владимира Храмцова к докладу про оптимизацию двух маленьких PHP проектов. Основыне тезисы: что происходит, когда увеличивается нагрузка, какие возникают проблемы и способы их решения.TRANSCRIPT
![Page 1: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/1.jpg)
Разработка на коленке
История оптимизации двух маленьких проектов
![Page 2: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/2.jpg)
А давайте напишем маленький скрипт
• Пользователю могут выдаваться очки
• Очки можно поменять на бонус
• Возможность посмотреть баланс
• Нет баланса – нет учетки
• Ответы реализованы в виде http codes (вроде как REST)
![Page 3: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/3.jpg)
LAMP
• PHP
• Apache (mod_php, mod_rewrite)
• MySQL (куда же без него)
![Page 4: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/4.jpg)
Выгрузились,запустились,
всё работает, клиенты ходят,
данные передаются
![Page 5: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/5.jpg)
Первая проблема
• Возрастает количество клиентов и MySQL начинает потреблять всё больше процессорных ресурсов, хотя slow query log пустой.
• Проблема в частых запросах к маленькой табличке. Запросы выполняются быстро (менее 1 секунды), но нагружается процессор.
![Page 6: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/6.jpg)
Но ненадолго
![Page 7: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/7.jpg)
Выгрузка нового билда мобильного приложения
• Возникает проблема, когда клиент начинает обращаться к серверу несколько раз в секунду вместо одного раза в 10 минут.
• Клиентов достаточно много, получаем DDOS атаку.
![Page 8: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/8.jpg)
Основные проблемы
• MySQL начинает сбрасывать соединения.
• Apache начинает проявлять прибалтийские кооорни.
![Page 9: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/9.jpg)
Пути решения
• Увеличение мощности сервера
• Кэширование (memcached).
• Изменяем порядок обработки запросов на php
![Page 10: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/10.jpg)
Увеличение мощности сервера
• Поскольку дело было на Amazon, увеличение мощности произошло с помощью одного клика мыши.
![Page 11: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/11.jpg)
Кэширование
• Самым частым запросом оказался запрос на получение учетной записи клиента. Однако для большинства запросов учеток не было. Пришлось кэшировать в memcache все ответы.
• Данные о пользователях сохранялись по предсказуемым ключам.
• На MySQL Query Cache не рассчитывали
![Page 12: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/12.jpg)
Изменение порядка обработки запросов на php
• Поскольку apache все равно не выдерживал потока запросов, было принято решение заменить его на nginx+php-fpm (не только потому что его использовать круто, а apache нет)
• Установка APC
![Page 13: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/13.jpg)
Результаты
• Увеличение обслуживаемых rps больше чем в два раза
• Падение нагрузки на сервер
• 99.9% hits в memcache
• Снижение нагрузки на дисковую систему
• Нет ситуации с долгим ожиданием ответа
![Page 14: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/14.jpg)
Второй проект
• Сеть для показа рекламы
• Нужно было написать не маленький скрипт, а мини систему управления контентом.
• Клиенты делают запросы и тянут рекламу с сервера.
![Page 15: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/15.jpg)
Опять же Lamp
• PHP
• Apache
• MySQL
![Page 16: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/16.jpg)
Опять же всё написано, выгружено и вроде даже
стабильно работает, статистика пишется и все происходит в режиме реального времени
![Page 17: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/17.jpg)
Первые проблемы
• Подсчет статистики при показе списка
• Кэширование с пересчетом раз в полчаса
![Page 18: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/18.jpg)
Появление новых возможностей
• Новые типы рекламы по запросу• Начинаем собирать информацию о
пользователях ( взаимодействие с приложениями - клиентами )
• Добавление рассылок push notifications• Деление пользователей на группы• Возможность фокусирования всех
типов реклам на отдельного пользователя.
![Page 19: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/19.jpg)
И вдруг одно из мобильных приложений выводят в top и
буквально сразу же начинаются проблемы с
производительностью серверной части
![Page 20: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/20.jpg)
Результаты вывода в top
• Много установленных приложений – много запросов к системе (К.О. или таки уже майор?)
• Приложения-будильники стартуют в одной часовой зоне практически одновременно (разбежка часов очень небольшая)
• Apache забивается запросами статики
![Page 21: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/21.jpg)
Что применялось
• Nginx
• Memcached
• Изменения в исходном коде
• APC
![Page 22: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/22.jpg)
Nginx
• Отдача статики для всех проектов на данном сервере
• Обратное проксирование
![Page 23: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/23.jpg)
Memcached
• Компромисс между мгновенным отражением изменений данных и производительностью системы.
• Кэширование редко изменяющихся данных
![Page 24: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/24.jpg)
Изменения в исходном коде
• Проверка некоторых условий на актуальность до главного запроса
• Изменение кода для избежания deadlocks в MySQL.
![Page 25: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/25.jpg)
Результаты
• Улучшение производительности, т.к. На отдачу статики не расходуются ресурсы apache
• Улучшение ситуации при работе с медленными клиентами.
• Снижение нагрузки на MySQL.
![Page 26: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/26.jpg)
Общие рекомендации
![Page 27: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/27.jpg)
Отделение часто изменяемых данных, от тех данных, которые
меняются редко. В частности это упрощает создание эффективной системы кэширования. Например
отделение информации о пользователе от его баланса
![Page 28: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/28.jpg)
Для упрощения поддержания кэша в адекватном состоянии
стоит использовать предсказуемые ключи,
например для пользователя userdata_{id}
![Page 29: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/29.jpg)
В некоторых случаях можно отражать изменения с некоторой
задержкой
![Page 30: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/30.jpg)
Кэширование не должно использоваться как костыль для
решения проблем приложения (а иногда так хочется).
![Page 31: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/31.jpg)
В первую очередь кэширование стоит применять для данных,
которые редко меняются.MySQL query cache vs
кэширование на стороне приложения.
![Page 32: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/32.jpg)
Как правило, при кэшировании всегда доступна операция delete.
![Page 33: Development on the Knee by Vladimir Khramtsov](https://reader035.vdocuments.site/reader035/viewer/2022062405/5561ee4fd8b42aa5068b55ab/html5/thumbnails/33.jpg)
В некоторых случаях имеет смысл использовать постоянные
соединения (persistent connections), однако надо
помнить, что некоторые модули чистят состояние соединения
(mysqli), а некоторые – нет (PDO).