Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

Like this? Share it with your network

Share

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

  • 1,438 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,438
On Slideshare
1,306
From Embeds
132
Number of Embeds
2

Actions

Shares
Downloads
8
Comments
0
Likes
0

Embeds 132

http://webcrunch.ru 127
http://developers.rambler.ru 5

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. Веб-сервер Phantom Влад Селиверстов Системный администратор YaC, Москва, 1 октября 2010 года
  • 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. Phantom • Конечный автомат (FSM) • EPOLL-based • Coroutine и continuations • Написан from scratch • Сильно оптимизирован 20
  • 21. Phantom • Не совсем честный FSM • Worker thread-ы можно групировать в пулы • Пулы можно привязывать к процессорам • Обработку разных типов запросов можно отдавать в разные пулы • Pure C++! :) 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