Самые частые проблемы и пути решения при росте
нагрузки и масштабировании проекта
Минкин Андрей. Namba Taxi
Кто я
• 4 года системным администратором• 4 года разработчиком на Python/Go
Что у нас вначале?
• Разрабатываем• Запускаем в продакшн• Обретаем глаза на продакшне
Глаза на продакшне
• Мониторинг• Сбор метрик(newrelic, opbeat, etc)• Сбор ошибок(sentry)
Ресурсов нет, но вы там держитесь
На что бывает нагрузка
• Disk IO• Net• RAM• CPU
Чем анализировать
• CPU/RAM – top/atop/htop/mpstat• Disk IO – iotop/iostat• RAM – free cat /etc/meminfo
Откуда нагрузка на диск?
• Чтение• Запись
Нагрузка на CPU
• Вычисления• Ожидание IO
Нагрузка на RAM
• Mem-leak• Храним много данных в памяти
Пути решения
• Оптимизация кода• Кеширование• Масштабирование
Оптимизация
• Берем uwsgiFouigne• Пишем map функцию• Загоняем в Excel• ????• PROFIT
uwsgiFouine --locale en_US.utf8 /path/to/wsgi.log
• Where was the most time spent?• What were the slowest pages (max page load time)?• What were the slowest pages (avg page load time)?
Path map function
uwsgiFouine
• uwsgiFouine --locale en_US.utf8 \ --path_map_function pmap.pmap /path/to/wsgi.log
uwsgiFouine. Пример
uwsgiFouine
• 10% методов -> 90% нагрузки
Django ORM
• select_related()• prefetch_related()
Кеширование
• Как внедрить• Как инвалидировать• Как оценить качество работы кеширования
Внедрение кеширования
Кеширование
• Как работает кеш• Что кешировать• Как кешировать• Инвалидация
Как работает кеш
• Key-value• Данные в оперативной памяти• Может? Флушить данные на диск• LRU – Least Recently Used
Что кешировать
• Результаты запросов к внешним API• Медленные выборки из БД• Долгий рендер html
Как кешировать и инвалидировать
• Кладем в кеш по ключу• Обновляем по крону• Дублированное кеширование
Кладем в кеш по ключу
Дублированное кеширование
Обновляем по крону
Оценка качества работы кеширования
• %hit rate• %miss rate
%hit rate и результат
• current > 95% - отлично• 85 < current < 95 – хорошо• current < 80 - плохо
Масштабирование
Когда внедрять?
• Все оптимизировано• Нет лишних запросов к ФС и БД• Админы все потюнили
Как внедрять?
• Масштабирование БД• Масштабирование App• Масштабирование ФС• Балансировка
Масштабирование БД
• Репликация(master/slave, master/master…) • Партицирование(partitioning)• Распределенная фс(hadoop fs, drbd)• Шардинг
Масштабирование App
• Как хранить сессии?• Как отдавать статику?• Как накатывать миграции?• Как деплоить?
Масштабирование ФС
• Storage engine• Distributed file storage
Балансировка
• На стороне сервера• На стороне клиента
Балансировка на серверах
• 1 frontend• Много бекендов• DNS round-robin
Балансировка. Проблемы
• Не гибко, если на клиенте• Неравномерное использование ресурсов
Конкурентный доступ
• БД• Cache
Что предложит нам Django?
https://docs.djangoproject.com/en/1.7/ref/models/queries/#f-expressions
А еще что?
Что это даст?
Как быть с redis?
Выводы.
• Используйте транзакции БД• Следите за качеством работы кеша• Разделяйте workflow
Вопросы?
• https://github.com/gen1us2k• Skype: gen1us2k• http://gen1us2k.com