Your SlideShare is downloading. ×
Влад Селиверстов – Веб-сервер Phantom
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

1,127
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,127
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. YaC, Москва, 1 октября 2010 года Системный администратор Влад Селиверстов Веб-сервер Phantom
  • 2. О чем разговор? 1. То, что все знают. 2. Почему свой? 3. Как устроен? 4. Что в комплекте? 5. Что получилось? 2
  • 3. То, что все знают 3
  • 4. Архитектура веб-сервиса Frontend: - HTTP-сервер Backend: - исполняемый код - база данных - сам “сервис” 4
  • 5. Что внутри? 5
  • 6. Проблемы? — Если worker-ов больше чем процессоров — возникает конкуренция за процессор. — Worker-ы могут блокировать друг-друга. — Если все worker-ы заблокированы, запросы накапливаются в очереди и ждут, когда освободится worker. 6
  • 7. Добавим скорости Accelerator: - “легкий” HTTP-сервер - обрабатывает быстрые запросы - обеспечивает Keep-Alive - проксирует запросы к Frontend-у 7
  • 8. А что здесь внутри? 8
  • 9. Все, что мы сделали — это разделили запросы к системе на два типа. 9
  • 10. Профит! — Запросы поделились на два типа — статика и динамика. — При правильной конфигурации статика будет отдаваться, даже если нет свободных worker-ов. 10
  • 11. Что будет, если добавить в нашу систему еще один тип запросов? 11
  • 12. Например 12
  • 13. Не так страшно — Для привязки worker-процессов к процессорам можно использовать cpu_affinity или cgroups. — При правильной конфигурации статика будет отдаваться, даже если нет свободных worker-ов. 13
  • 14. А если добавить еще один тип запросов? 14
  • 15. Например 15
  • 16. Это работает. 16
  • 17. Но это неудобно. 17
  • 18. Мы решили сделать свой web-server, лишенный этих неудобств. 18
  • 19. Phantom 19
  • 20. • Конечный автомат (FSM) • EPOLL-based • Coroutine и continuations • Написан from scratch • Сильно оптимизирован Phantom 20
  • 21. • Не совсем честный FSM • Worker thread-ы можно групировать в пулы • Пулы можно привязывать к процессорам • Обработку разных типов запросов можно отдавать в разные пулы • Pure C++! :) Phantom 21
  • 22. Как устроен? 22
  • 23. Две основных абстракции Phantom — Планировщик выполнения — Нить выполнения 23
  • 24. Планировщик выполнения 24
  • 25. Описание шедулеров scheduler_t fast_scheduler = scheduler_simple_t { threads = 1 event_buf_size = 1000 timeout_prec = 1 policy = fifo priority = 98 } 25
  • 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. Привязка путей к хэндлерам host = { "test.yandex.ru" : { path = { "/fast" : { handler = fast_handler } "/medium" : { handler = medium_handler } "/heavy" : { handler = heavy_handler } } } 27
  • 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
  • 30. Нить выполнения - принять соединение - изготовить continuation - передать его протоколлеру - распарсить запрос - переложить continuation в соответствующий scheduler - передать управление соответствующему хэндлеру 30
  • 31. Что в комплекте? 31
  • 32. Написав прототип, мы столкнулись с проблемой его тестирования для дальнейшей оптимизации. 32
  • 33. И ещё раньше чем мы научили phantom отвечать на запросы, мы научили его их задавать. 33
  • 34. Для этого пришлось написать отдельный модуль, использовав уже существующий планировщик. 34
  • 35. Нить выполнения - изготовить необходимое количество continuation-ов - передать их протоколлеру - вычитать запрос из лога - отправить запрос если пришло время - вычитать и распарсить ответ - обновить статистику 35
  • 36. Инструмент для нагрузочного тестирования Phantom — Поддержка любых stateless-протоколов — Равномерность создаваемой нагрузки — Высокая производительность — На его основе написан фреймворк для нагрузочного тестирования - Lunapark 36
  • 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
  • 39. 50000 RPS ~ 2ms/request 39
  • 40. Конфигурация с двумя scheduler-ами 40
  • 41. Тяжелые запросы в одном scheduler-е 41
  • 42. Легкие запросы в другом 42
  • 43. Ура! Вопросы! 43
  • 44. Phantom будет выложен в opensource. 44
  • 45. Как только мы допишем поддержку FastCGI. :)
  • 46. phantom 46
  • 47. Лѐгкий веб-сервер :) 47
  • 48. nginx vs phantom 48
  • 49. Системный администратор 119021, Россия, Москва, ул. Льва Толстого, 16. +7 (495) 739-00-00 +7 (495) 739-70-70 — факс behemot@yandex-team.ru Влад Селиверстов