Влад Селиверстов – Веб-сервер Phantom

1,383 views
1,248 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,383
On SlideShare
0
From Embeds
0
Number of Embeds
138
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Влад Селиверстов – Веб-сервер Phantom

  1. 1. YaC, Москва, 1 октября 2010 года Системный администратор Влад Селиверстов Веб-сервер Phantom
  2. 2. О чем разговор? 1. То, что все знают. 2. Почему свой? 3. Как устроен? 4. Что в комплекте? 5. Что получилось? 2
  3. 3. То, что все знают 3
  4. 4. Архитектура веб-сервиса Frontend: - HTTP-сервер Backend: - исполняемый код - база данных - сам “сервис” 4
  5. 5. Что внутри? 5
  6. 6. Проблемы? — Если worker-ов больше чем процессоров — возникает конкуренция за процессор. — Worker-ы могут блокировать друг-друга. — Если все worker-ы заблокированы, запросы накапливаются в очереди и ждут, когда освободится worker. 6
  7. 7. Добавим скорости Accelerator: - “легкий” HTTP-сервер - обрабатывает быстрые запросы - обеспечивает Keep-Alive - проксирует запросы к Frontend-у 7
  8. 8. А что здесь внутри? 8
  9. 9. Все, что мы сделали — это разделили запросы к системе на два типа. 9
  10. 10. Профит! — Запросы поделились на два типа — статика и динамика. — При правильной конфигурации статика будет отдаваться, даже если нет свободных worker-ов. 10
  11. 11. Что будет, если добавить в нашу систему еще один тип запросов? 11
  12. 12. Например 12
  13. 13. Не так страшно — Для привязки worker-процессов к процессорам можно использовать cpu_affinity или cgroups. — При правильной конфигурации статика будет отдаваться, даже если нет свободных worker-ов. 13
  14. 14. А если добавить еще один тип запросов? 14
  15. 15. Например 15
  16. 16. Это работает. 16
  17. 17. Но это неудобно. 17
  18. 18. Мы решили сделать свой web-server, лишенный этих неудобств. 18
  19. 19. Phantom 19
  20. 20. • Конечный автомат (FSM) • EPOLL-based • Coroutine и continuations • Написан from scratch • Сильно оптимизирован Phantom 20
  21. 21. • Не совсем честный FSM • Worker thread-ы можно групировать в пулы • Пулы можно привязывать к процессорам • Обработку разных типов запросов можно отдавать в разные пулы • Pure C++! :) Phantom 21
  22. 22. Как устроен? 22
  23. 23. Две основных абстракции Phantom — Планировщик выполнения — Нить выполнения 23
  24. 24. Планировщик выполнения 24
  25. 25. Описание шедулеров scheduler_t fast_scheduler = scheduler_simple_t { threads = 1 event_buf_size = 1000 timeout_prec = 1 policy = fifo priority = 98 } 25
  26. 26. Описание шедулеров scheduler_t heavy_scheduler = scheduler_combined_t { threads = 1 event_buf_size = 1000 timeout_prec = 1 policy = fifo priority = 98 poolsize = 2 } scheduler_t medium_scheduler = scheduler_combined_t { threads = 1 event_buf_size = 1000 timeout_prec = 1 policy = fifo priority = 98 poolsize = 2 } 26
  27. 27. Привязка путей к хэндлерам host = { "test.yandex.ru" : { path = { "/fast" : { handler = fast_handler } "/medium" : { handler = medium_handler } "/heavy" : { handler = heavy_handler } } } 27
  28. 28. Привязка хэндлеров к шедулерам handler_t fast_handler = handler_fast_t { scheduler = fast_scheduler } handler_t medium_handler = handler_medium_t { scheduler = medium_scheduler } handler_t heavy_handler = handler_fast_t { scheduler = heavy_scheduler } 28
  29. 29. Профит! 29
  30. 30. Нить выполнения - принять соединение - изготовить continuation - передать его протоколлеру - распарсить запрос - переложить continuation в соответствующий scheduler - передать управление соответствующему хэндлеру 30
  31. 31. Что в комплекте? 31
  32. 32. Написав прототип, мы столкнулись с проблемой его тестирования для дальнейшей оптимизации. 32
  33. 33. И ещё раньше чем мы научили phantom отвечать на запросы, мы научили его их задавать. 33
  34. 34. Для этого пришлось написать отдельный модуль, использовав уже существующий планировщик. 34
  35. 35. Нить выполнения - изготовить необходимое количество continuation-ов - передать их протоколлеру - вычитать запрос из лога - отправить запрос если пришло время - вычитать и распарсить ответ - обновить статистику 35
  36. 36. Инструмент для нагрузочного тестирования Phantom — Поддержка любых stateless-протоколов — Равномерность создаваемой нагрузки — Высокая производительность — На его основе написан фреймворк для нагрузочного тестирования - Lunapark 36
  37. 37. Пример запроса 306 100 GET /su/ HTTP/1.1 Host: ****.yandex.ru Accept: */* Connection: close Referer: http://afisha.yandex.ru/spb/events/?category=cinema&page=2 User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; ru-ru) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 X-Real-IP: xxx.xxx.xx.xxx 37
  38. 38. Немного картинок 38
  39. 39. 50000 RPS ~ 2ms/request 39
  40. 40. Конфигурация с двумя scheduler-ами 40
  41. 41. Тяжелые запросы в одном scheduler-е 41
  42. 42. Легкие запросы в другом 42
  43. 43. Ура! Вопросы! 43
  44. 44. Phantom будет выложен в opensource. 44
  45. 45. Как только мы допишем поддержку FastCGI. :)
  46. 46. phantom 46
  47. 47. Лѐгкий веб-сервер :) 47
  48. 48. nginx vs phantom 48
  49. 49. Системный администратор 119021, Россия, Москва, ул. Льва Толстого, 16. +7 (495) 739-00-00 +7 (495) 739-70-70 — факс behemot@yandex-team.ru Влад Селиверстов

×