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!

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

on

  • 1,379 views

 

Statistics

Views

Total Views
1,379
Views on SlideShare
1,247
Embed Views
132

Actions

Likes
0
Downloads
7
Comments
0

2 Embeds 132

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

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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