Приемы разработки высоконагруженных приложений на  Twisted (Python) Андрей Смирнов /  /
Задача <ul><li>Постоянные соединения
Много соединений
&quot;Легкие&quot; запросы
Низкое CPU time/wall time на один запрос </li></ul>
Twisted Framework <ul><li>Python
Ядро:  async IO  (select/poll)
Deferred  — асинхронная модель программирования
Реализация протоколов: </li><ul><li>DNS, HTTP, IMAP, memcached, AMQP, … </li></ul></ul>
Сервер на Twisted <ul><li>Один процесс, одна нить
Асинхронный ввод-вывод  (memcached, nginx, haproxy, …)
В одном процессе обрабатывается несколько запросов одновременно </li></ul>
Миф/правда №1 <ul><li>Python  не подходит для серверной разработки  </li></ul>
Python - медленный <ul><li>Примерно  10x  медленнее C
Но  90%  времени выполнения приходится на  10%  кода
Cython, Nukitka, Unladen Swallow, …
Профайлинг — kcachegrind  </li></ul>
Память в Python <ul><li>Подсчет ссылок
Сборщик мусора для разрыва циклов
Средства анализа — gc, heapy
Оптимизация: __slots__, Cython, ... </li></ul>
Один поток/процесс <ul><li>Многоядерные процессоры
Локальность, NUMA, привязка к процессору </li></ul>
ссNUMA Interconnection <ul><li>CPU binding
Node binding
Local alloc </li></ul>+10-15% CPU CPU Memory CPU CPU Memory
Архитектура сервиса DB1 DB2 App1 App2 App3 Proxy
Upcoming SlideShare
Loading in …5
×

Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)

1,085 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,085
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)

  1. 1. Приемы разработки высоконагруженных приложений на Twisted (Python) Андрей Смирнов / /
  2. 2. Задача <ul><li>Постоянные соединения
  3. 3. Много соединений
  4. 4. &quot;Легкие&quot; запросы
  5. 5. Низкое CPU time/wall time на один запрос </li></ul>
  6. 6. Twisted Framework <ul><li>Python
  7. 7. Ядро: async IO (select/poll)
  8. 8. Deferred — асинхронная модель программирования
  9. 9. Реализация протоколов: </li><ul><li>DNS, HTTP, IMAP, memcached, AMQP, … </li></ul></ul>
  10. 10. Сервер на Twisted <ul><li>Один процесс, одна нить
  11. 11. Асинхронный ввод-вывод (memcached, nginx, haproxy, …)
  12. 12. В одном процессе обрабатывается несколько запросов одновременно </li></ul>
  13. 13. Миф/правда №1 <ul><li>Python не подходит для серверной разработки </li></ul>
  14. 14. Python - медленный <ul><li>Примерно 10x медленнее C
  15. 15. Но 90% времени выполнения приходится на 10% кода
  16. 16. Cython, Nukitka, Unladen Swallow, …
  17. 17. Профайлинг — kcachegrind </li></ul>
  18. 18. Память в Python <ul><li>Подсчет ссылок
  19. 19. Сборщик мусора для разрыва циклов
  20. 20. Средства анализа — gc, heapy
  21. 21. Оптимизация: __slots__, Cython, ... </li></ul>
  22. 22. Один поток/процесс <ul><li>Многоядерные процессоры
  23. 23. Локальность, NUMA, привязка к процессору </li></ul>
  24. 24. ссNUMA Interconnection <ul><li>CPU binding
  25. 25. Node binding
  26. 26. Local alloc </li></ul>+10-15% CPU CPU Memory CPU CPU Memory
  27. 27. Архитектура сервиса DB1 DB2 App1 App2 App3 Proxy
  28. 28. Добавим кэш DB1 DB2 App1 App2 App3 Proxy Cache Cache Cache
  29. 29. Когерентность кэшей Message bus App1 Cache App2 Cache App3 Cache
  30. 30. AMQP: шина сообщений <ul><li>Варианты доставки: </li><ul><li>fanout (один ко всем)
  31. 31. origin (один к одному) </li></ul><li>RabbitMQ — брокер
  32. 32. txAMQP — драйвер
  33. 33. ZeroMQ </li></ul>
  34. 34. Локализация клиентов Message bus App2 App3 Proxy App1 IP IP IP
  35. 35. Key-value хранилища <ul><li>Memcached — встроенный </li><ul><li>memcached, MemcacheDB, MemcacheQ, membase, ... </li></ul><li>txRedis
  36. 36. txMongo
  37. 37. ... </li></ul>
  38. 38. Хранение объектов pickling Object(id=199) key1=v1 key2=v2 ... key-value storage Object_199 pickled Object_378 pickled Object _988 pickled
  39. 39. Сортированный список user_199_posts (id, date) (197, 11:03) (180, 10:45) (111, 9:50) (120, 9:01) (98, 8:15) (60, 7:05) (42, 7:04) (37, 7:01) post_197 post_180 post_111 post_120 text=&quot;Nice shoes...&quot; author=&quot;john&quot; tags=['dev','schedule'] text=&quot;Nice shoes...&quot; author=&quot;john&quot; tags=['dev','schedule'] ... ...
  40. 40. Нумерация экземпляров Memcached <ul><li>&quot;Свой&quot; номер </li><ul><li>increment/add </li></ul><li>Список всех экземпляров </li><ul><li>append/add </li></ul></ul>origin origins[]
  41. 41. Статистика Memcached origins Agg App1 App2 stats_1 stats_2
  42. 42. <ul><li>Twisted: manhole + telnet/ssh
  43. 43. $ telnet localhost 2000 </li></ul>Обслуживание
  44. 44. C100k+ <ul><li>Firewall в stateless mode
  45. 45. twistd: reactor=epoll (kqueue)
  46. 46. Минимизируем активность соединения
  47. 47. Анализируем объем памяти на соединение </li></ul>
  48. 48. Масштабирование <ul><li>Каждый новый клиент — какие ресурсы потребляет?
  49. 49. Какой процент ресурсов &quot;сервера&quot; и остальных серверов (в т.ч. разделяемых)? </li></ul>
  50. 50. Масштабирование Ресурсы &quot;своего&quot; сервера Другие сервера Разделяемые ресурсы
  51. 51. Оптимизация <ul><li>Минимизация межсерверного взаимодействия </li><ul><li>Агрегация сообщений </li></ul><li>Используем высокопроизводительные компоненты </li><ul><li>memcached, MongoDB, RabbitMQ, cPickle, ... </li></ul></ul>
  52. 52. Цифры <ul><li>JSON-RPC, &quot;hello world&quot; </li><ul><li>890 req/s @ 0.022 sec
  53. 53. 530 req/s @ 0.006 sec </li></ul></ul>
  54. 54. Цифры <ul><li>Реальная система (кластер) </li><ul><li>JSON-RPC : 710 req/sec
  55. 55. memcachedX : 11833 req/sec
  56. 56. AMQP : 800 req/sec
  57. 57. connections : 600K+ (670 reconnects/sec) </li></ul></ul>
  58. 58. Контакты <ul><li>Андрей Смирнов </li><ul><li>Руководитель web-разработки Qik </li></ul><li>[email_address] , [email_address]
  59. 59. http://www.smira.ru/ , @smira </li></ul>

×