Самые частые проблемы и пути решения при росте...
Embed Size (px)
TRANSCRIPT

Самые частые проблемы и пути решения при росте
нагрузки и масштабировании проекта
Минкин Андрей. 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