Your SlideShare is downloading. ×
0
YaC, Москва, 1 октября 2010 года
Системный администратор
Влад Селиверстов
Веб-сервер Phantom
О чем разговор?
1. То, что все знают.
2. Почему свой?
3. Как устроен?
4. Что в комплекте?
5. Что получилось?
2
То, что все знают
3
Архитектура веб-сервиса
Frontend:
- HTTP-сервер
Backend:
- исполняемый код
- база данных
- сам “сервис”
4
Что внутри?
5
Проблемы?
— Если worker-ов больше чем процессоров —
возникает конкуренция за процессор.
— Worker-ы могут блокировать друг-...
Добавим скорости
Accelerator:
- “легкий” HTTP-сервер
- обрабатывает быстрые
запросы
- обеспечивает Keep-Alive
- проксирует...
А что здесь внутри?
8
Все, что мы сделали — это
разделили запросы к системе
на два типа.
9
Профит!
— Запросы поделились на два типа —
статика и динамика.
— При правильной конфигурации статика
будет отдаваться, даж...
Что будет, если добавить в
нашу систему еще один тип
запросов?
11
Например
12
Не так страшно
— Для привязки worker-процессов к
процессорам можно использовать
cpu_affinity или cgroups.
— При правильной...
А если добавить еще один тип
запросов?
14
Например
15
Это работает.
16
Но это неудобно.
17
Мы решили сделать свой
web-server, лишенный этих
неудобств.
18
Phantom
19
• Конечный автомат (FSM)
• EPOLL-based
• Coroutine и continuations
• Написан from scratch
• Сильно оптимизирован
Phantom
20
• Не совсем честный FSM
• Worker thread-ы можно групировать в
пулы
• Пулы можно привязывать к процессорам
• Обработку разн...
Как устроен?
22
Две основных абстракции
Phantom
— Планировщик выполнения
— Нить выполнения
23
Планировщик выполнения
24
Описание шедулеров
scheduler_t fast_scheduler = scheduler_simple_t {
threads = 1
event_buf_size = 1000
timeout_prec = 1
po...
Описание шедулеров
scheduler_t heavy_scheduler = scheduler_combined_t {
threads = 1
event_buf_size = 1000
timeout_prec = 1...
Привязка путей к хэндлерам
host = {
"test.yandex.ru" : {
path = {
"/fast" : { handler = fast_handler }
"/medium" : { handl...
Привязка хэндлеров к шедулерам
handler_t fast_handler = handler_fast_t {
scheduler = fast_scheduler
}
handler_t medium_han...
Профит!
29
Нить выполнения
- принять соединение
- изготовить continuation
- передать его протоколлеру
- распарсить запрос
- переложит...
Что в комплекте?
31
Написав прототип, мы
столкнулись с проблемой его
тестирования для
дальнейшей оптимизации.
32
И ещё раньше чем мы
научили phantom отвечать на
запросы, мы научили его их
задавать.
33
Для этого пришлось написать
отдельный модуль,
использовав уже
существующий планировщик.
34
Нить выполнения
- изготовить необходимое количество
continuation-ов
- передать их протоколлеру
- вычитать запрос из лога
-...
Инструмент для нагрузочного
тестирования
Phantom
— Поддержка любых stateless-протоколов
— Равномерность создаваемой нагруз...
Пример запроса
306 100
GET /su/ HTTP/1.1
Host: ****.yandex.ru
Accept: */*
Connection: close
Referer: http://afisha.yandex....
Немного картинок
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 — факс
behemo...
Upcoming SlideShare
Loading in...5
×

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

1,162

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

No notes for slide

Transcript of "Влад Селиверстов – Веб-сервер 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 Влад Селиверстов
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×