+ All Categories
Home > Software > Особенности работы backend для мобильных приложений или...

Особенности работы backend для мобильных приложений или...

Date post: 07-Jan-2017
Category:
Upload: mailru-group
View: 7,215 times
Download: 1 times
Share this document with a friend
25
Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен Дмитрий Швеенков, руководитель команды разработки
Transcript
Page 1: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен

Дмитрий Швеенков, руководитель команды разработки

Page 2: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

О себе

Дмитрий Швеенков

Руководитель команды разработки в Mail.Ru Group

mailto: [email protected]

2

Page 3: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Мобильные приложения

Новости Гороскопы

3

Page 4: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

О чем доклад

- Особенности разработки backend для мобильных приложений

- Измерение времени ответа backend

- Особенности работы стека python – django – uwsgi – nginx

- Оптимизация производительности

- Инструменты и подходы, которые мы используем

4

Page 5: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Задачи backend

- Агрегация информации о новостных ресурсах

- Хранение медиа контента

- Кэширование данных

- JSON API

- Работа с изображениями (crop, resize)

5

Page 6: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Особенности разработки API

- Разнообразие устройств и ОС:

- Планшеты

- Смартфоны

- iOS

- Android

- Windows phone

- и т.п.

- Редизайн мобильных приложений

- Версионирование API

- Медленное обновление версий приложений

- Большая пиковая нагрузка

6

Page 7: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Время запуска приложения

Время запуска влияет на ретеншен - http://bit.ly/2cDc60a

7

Page 8: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Допустимое время ответа backend

Каким должен быть response_time?

- 1 секунда, это быстро?

- 5 секунд?

- 200 миллисекунд, норма

8

Page 9: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Как измерить время работы backend?

- Измерения на backend - timeit $ python -m timeit '"-".join(str(n) for n in range(100))'

- Измерения на клиенте - wrk, ab, siege

- Nginx access logs log_format main '$remote_addr - [$time_local] "$request" ' '$status $bytes_sent $request_length '

'$request_time $upstream_response_time'

9

Page 10: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Графики rps и upstream_time

10

Page 11: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

upstream_response_time хороший показатель?

Среднее для upstream_response_time(20 + 10 + 20 + 10 + 10 + 20 + 500 + 500 + 500 + 400) / 10 = 199мс

Персентили http://bit.ly/2d4z5zi $ fgrep "13/Sep/2016:10:" access.log | awk '{print $NF}' | sort -n | python percentile_stdin.py

11

Page 12: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Сбор метрик в продакшен

- Statsd+Graphite+Grafanahttps://github.com/bitly/statsdaemonhttp://graphiteapp.org/ http://grafana.org/

- Отправка из uwsgi --carbon 127.0.0.1:2003

- Diamond для cpu, la, network и iostathttps://github.com/python-diamond/Diamond

- Хранение истории

- Группировка по платформам ios/android

- Автоматизация сравнения графиковhttp://bit.ly/2d8fcHl

12

Page 13: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

- Рост кол-ва пользователей приводит к росту qps к backend

- Рост qps потребляет ресурсы сервера

- Для обработки запросов требуются uwsgi-workers

Как выбрать оптимальное количество workers? http://bit.ly/2cDjGpA

cpu cores x 2

Рост нагрузки, стек python – django – uwsgi – nginx

13

Page 14: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Как uWSGI обрабатывает входящие запросы?

Рост нагрузки

bindlisten fork

while true:

accept

uWSGI master uWSGI worker

14

Page 15: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Рост нагрузки

- uwsgi options --thunder-lock - http://bit.ly/2ckdRPe

- David Cramer, discus.com - http://bit.ly/2cxckEX

15

Page 16: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Рост нагрузки

Параметры nginx http://bit.ly/2cfxEkh:

- uwsgi_buffers

- uwsgi_buffer_sizelocation /news {

uwsgi_pass mobs_backend;include uwsgi_params;uwsgi_buffers 256 16k;

}

16

Page 17: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Профилирование django-python

Профилирование начинается в голове разработчика ©http://bit.ly/2cV82Gg http://bit.ly/2ckeTKS

pip install django-extensionsINSTALLED_APPS += ('django_extensions',)python manage.py runprofileserver --use-cprofile --prof-path=~/profwget -O- -S http://127.0.0.1:8000/news/v2/getNewsById?id=291235 gprof2dot -f pstats ~/prof/out.prof | dot -Tpng -o ~/prof/out.png

17

Page 18: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Визуализация результатов профилирования

18

Page 19: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Визуализация результатов профилирования

19

Page 20: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Тюнинг memcached

- python-memcached pickle/cpickle commit http://bit.ly/2ckfdJL

- модуль pymemcache http://bit.ly/2cDCsir

- упаковка/распаковка через msgpack

- использование опций noreply=true, tcp_nodelay=120

Page 21: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

К чему мы стремимся при разработке backend

- Меньше обращений

- Легкие запросы

- Простые решения

21

Page 22: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Подводим итоги

- Разработка backend для мобильных приложений отличается от backend для web приложений

- Производительность стека python – django – uwsgi – nginx требует экспериментальных проверок в продакшен

- Для мобильного приложения очень важно время ответа backend

- Время ответа backend нужно измерять правильно

22

Page 23: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Вопросы?

Спасибо за внимание!

mailto: [email protected]

23

Page 24: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Настройка mysql

- myISAM, не используем транзакции- key_buffer_size >= sum(du -hs *.MYI)- ssd- mysql_query_cache- mysql_slow_query_log

24

Page 25: Особенности работы backend для мобильных приложений или Python Django UWSGI в продакшен, Дмитрий Швеенков, Mail.Ru

Пример кода view, чего стараемся избегать

class GetNewsByIdView(BaseNewsView):

def get_response(self, request):

if version == "1.0":

return {...}

elif version == "2.0":

return []

25


Recommended