Приключения проекта от
компьютера
разработчика до
серьезных нагрузок
Минкин Андрей maddevs.io
Кто я
• Тимлид в Mad Devs
• Nambataxi.kg
• Nambafood.kg
Начало
• Кодим
• Тестируем
• Запускаем в продакшн
Глаза на продакшне
• Мониторинг
• Сбор метрик
• Сбор ошибок
• Трейсинг
Какая нагрузка бывает
• Disk IO
• Net
• RAM
• CPU
Проблемы воспроизведения ситуации
• Нагрузочное тестирование может не работать
• Пользователь думает по-другому
• Окружение разное
• Продакшн
• Стейджинг
• Компьютер разработчика
У меня на компе работает
• Нет
• Нельзя так думать
•Вы не в детском саду
•Вы ответственны за ваш проект в продакшне
•Вам с этим жить
Как быть?
• Оптимизировать код
• Внедрять кэширование
• Масштабировать
Как правильно оптимизировать
• Собрать метрики
• Проанализировать
• Оптимизировать
• Задеплоить
• Повторить
20 % методов -> 80% нагрузки
Принципы оптимизаций
• БД
• Убиваем N+1 запросы(+join)
• Расставляем индексы
• Убиваем бесконечные циклы
• Адаптируем алгоритмы
• Кэшируем данные
• Масштабируем
Внедрение кэширования
Проблема №1
Кэширование есть, а пользователи жалуются
• Один пользователь доволен
• Страницы быстро грузятся
• Другой нет
• Все медленно работает
Как проверить работает ли кэш?
• %hit rate
• %miss rate
Анализ показателей
• current > 95% – отлично
• 85 < current < 95 – хорошо
• current < 80 – плохо
Почему это плохо
• Мы сходили в кэш
• Там нет ключа
• Пошли генерить данные по-новой
• Отдали клиенту
Почему это плохо
• Мы сходили в кэш
• Там нет ключа
• Пошли генерить данные по новой
• Отдали клиенту
Проблема №2
• Холодный старт кэша
• Все серверы выключились
• Нужно запустить проект
• Проверить, что все работает
Как поднять проект после блэкаута
• Запускаем сервера
• Запускаем виртуалки
• Запускаем сервисы
• БД
• Кэши
• Хранилища
Как поднять проект после блэкаута
• Закрываем проект от пользователей
• Прогреваем кэш
• Автоматически
• Вручную
• Проверяем работу
• Открываем проект
Как закрыть проект для всех (nginx)
set $m "";
set $i "";
if ( -f /tmp/offline ) {set $m T;}
if ($remote_addr = 'your ip') {set $i "${m}";}
if ($i) { break; }
if ($m) {return 503;}
Проблема №3
Нагрузка маленькая, но все тормозит
• Смотрим память – все ОК
• Смотрим проц – все ОК
• Смотрим базу – все ОК
• Смотрим диски – все ОК
• Ничего не тормозит
• НО ГЛАВНАЯ НЕ РАБОТАЕТ
Что говорят графики
• Диски – ОК
• Процы – ОК
• Память – ОК
• Сеть?
Сеть?
• Сеть – либо работает, либо нет
• Все работает
• Пинги ходят
• Пропускная способность?
График загрузки здорового человека
0
10
20
30
40
50
60
70
80
90
100
График загрузки курильщика
0
10
20
30
40
50
60
70
80
90
100
Сеть перегружена
Кто гоняет трафик?
• Tcpdump+wireshark в поисках виновного
• Кто генерит трафик? – мемкэш
• Почему?
1 ключ весит 10мб
• На главной
• Нагруженного проекта
• С 2500 подключенными пользователями
• 2500x10 ~ 2.5Gb/s
Не кладите в кэш большие данные
Масштабирование
Когда масштабироваться?
• Плоский профиль нагрузки
• Вы лежите
• Все оптимизировано
• Нет лишних запросов к ФС и БД
• Админы все потюнили
Первые шаги
Меня вылогинивает
• Сессии в базу
• Или в кэш
Где картинки?
• Riak
• Minio
• nginx-cache
Нет состояния – нет проблем
Проблема №4
• Деплой завис, а вместе с ним и сайт
Легла база
• Нагрузка на диск
• Нагрузка на проц
Что говорит show processlist
• Висит альтер
• На большую таблицу
• Которую заблокировал альтер
Как не класть базу?
• Закрыть проект и деплоить без нагрузки
• Pt-online-schema-change
• Рекомендации по no downtime alter вашей БД
История одного файлообменника
• Храним файлы
• Файлы терять нельзя
• Давай сделаем все на рейдах
Что дали опыты
• При множественном запросе разных файлов IO падает
• Не масштабируется. Добавлением второго рейда.
• Какой бы ни был массив, скорость не прибавится
И тут мы прилегли
• 10 человек работают с файлами, и скорость 10кбс у
каждого
Рейды в топку
• Храним на дисках
• >2 копии одного файла
• >2 дисках
• =хранение денег и места
Разница скорости
• 1 диск = 100 iops
• Raid5 (5 hdd) = 100 iops
• 5hdd = 500iops
Плюсы
• Своя скорость у каждого диска
• Если один тормозит – тормозит только он
• Сервис более живучий
• Каждый диск увеличивает IO
Минусы
• Свои велосипеды для репликации
• Надежность софта, который занимается репликацией
Как реплицировать
• Дисками?
• Серверами?
• Серверами и дисками
• При replication factor=2 не страшно терять ни сервер, ни диски
• Прощайте, raid-массивы и их гемор
• Простота в обслуживании стораджей
Проблема №5
• Как купить две акции по цене одной
Не надо так
def update_balance(self, balance):
self.balance += balance
self.save()
И так тоже не надо
def update_balance(self, balance):
Profile.objects.filter(
pk=self.pk
).update(balance=F(‘balance’) + balance)
Транзакции – наш выбор
def update_balance(self, balance):
with transaction.atomic():
Profile.objects.filter(
pk=self.pk
).select_for_update()
.update(balance=F(‘balance’) + balance)
Talk sql to me
BEGIN;
SELECT … from profile_profile where
id=some_id FOR UPDATE;
UPDATE `profile_profile` set `balance` =
(`balance` + ‘-10’) WHERE `id`=7551;
COMMIT;
Read-committed
+Кидает transaction management error
-Бывают дедлоки
Repeatable-read
+ Без дедлоков
-? Не кидает transaction management error
Выводы
• Забудьте «у меня работает»
• Окружение – важно
• Не делайте ничего без данных на руках
• Не кладите большие данные в кэш
• Используйте внешние хранилища
• Нет состояния - нет проблем
Выводы
• Изучите no-downtime альтеры вашей БД
• Используйте транзакции в БД для целостности данных
• Используйте рабочий для вас уровень изоляции данных в
БД
Вопросы?
• @gen1us2k
• http://gen1us2k.com
• @maddevsio
• http://maddevs.io
• http://blog.maddevs.io

Приключения проекта от компьютера разработчика до серьезных нагрузок/ The project adventure from developer computer to serious loads

Editor's Notes

  • #5 Трейсинг самое сложное. Мы сделали сначала мониторинг, потом сбок метрик и ошибок и только потом трейсинг Если есть что рассказать про фолс позитив, то нужно рассказать
  • #6 Рассказать чем анализировать
  • #7 Мы делаем тестирование только на то. Что мы знаем что оно тормозит То что работает шустро работает – не тестируем Что тормозит – запрашивается редко Что работает шустро – тормозит Тестируем со своей колокольни а юзер мыслит по другому
  • #11 Рассказать пару интересных историй из жизни.
  • #12 Есть что оптимизировать малыми силами Нам повезло Зависит от проекта
  • #16 Это все потому что мы не знаем работает кеш или нет
  • #29 Сеть курильшика, сеть здорового человека.
  • #30 Сеть курильшика, сеть здорового человека.
  • #33 Рассказать что за ключ и почму он там оказался
  • #37 Имеет смысл погооврить про тех кто изначально не закладывал мастабирование
  • #38 В чем смысл истории и не хватает слайдов
  • #40 Пронумеровать правила сквозным образом.
  • #43 Что такое большая таблица
  • #46 А давайте сделаем raid5 Raid10 быстрее, но дороже Raid0 – не надежно Raid1 – смысли? Много места Мало IO
  • #51 Каждый диск в кластере добавляет IO в общую систему а с рейдами каждый диск работает на скорости самого медленного диска в рейдею Надо самому писать код который будет все это хендлить