49
YaC, Москва, 1 октября 2010 года Системный администратор Влад Селиверстов Веб-сервер Phantom

Веб-сервер Phantom

  • Upload
    yaevents

  • View
    12.448

  • Download
    0

Embed Size (px)

DESCRIPTION

При проектировании нагруженных систем приходится сталкиваться с тем, что разные типы запросов к веб-серверам затрачивают разное количество ресурсов, выполняются за разное количество времени и имеют разные приоритеты выполнения. Некоторые запросы «стоят» мало и должны выполняться как можно быстрее. Некоторые «стоят» дорого, и главное, чтобы они не блокировали обработку быстрых запросов. Существующие схемы приоритезации показались нам громоздкими и неудобными – при росте количества типов запросов конфигурация системы усложнялась в разы. Поэтому, чтобы решить эту проблему, а также для того, чтобы сделать ответы на запросы еще более быстрыми, мы написали свой веб-сервер – Phantom. Я расскажу вам, как он устроен, покажу, какие задачи можно решать с его помощью, а в завершение покажу на практике, как работает приоритезация разных типов запросов, используя для этого инструмент нагрузочного тестирования, основанный на Phantom.

Citation preview

Page 1: Веб-сервер Phantom

YaC, Москва, 1 октября 2010 года

Системный администраторВлад Селиверстов

Веб-сервер Phantom

Page 2: Веб-сервер Phantom

О чем разговор?

1. То, что все знают.

2. Почему свой?

3. Как устроен?

4. Что в комплекте?

5. Что получилось?

2

Page 3: Веб-сервер Phantom

То, что все знают

3

Page 4: Веб-сервер Phantom

Архитектура веб-сервиса

Frontend:- HTTP-сервер

Backend:- исполняемый код- база данных- сам “сервис”

4

Page 5: Веб-сервер Phantom

Что внутри?

5

Page 6: Веб-сервер Phantom

Проблемы?

— Если worker-ов больше чем процессоров —возникает конкуренция за процессор.

— Worker-ы могут блокировать друг-друга.

— Если все worker-ы заблокированы, запросы накапливаются в очереди и ждут, когда освободится worker.

6

Page 7: Веб-сервер Phantom

Добавим скорости

Accelerator:- “легкий” HTTP-сервер- обрабатывает быстрые запросы- обеспечивает Keep-Alive- проксирует запросы к Frontend-у

7

Page 8: Веб-сервер Phantom

А что здесь внутри?

8

Page 9: Веб-сервер Phantom

Все, что мы сделали — это разделили запросы к системе

на два типа.

9

Page 10: Веб-сервер Phantom

Профит!

— Запросы поделились на два типа —статика и динамика.

— При правильной конфигурации статика будет отдаваться, даже если нет свободных worker-ов.

10

Page 11: Веб-сервер Phantom

Что будет, если добавить в нашу систему еще один тип

запросов?

11

Page 12: Веб-сервер Phantom

Например

12

Page 13: Веб-сервер Phantom

Не так страшно

— Для привязки worker-процессов к процессорам можно использовать cpu_affinity или cgroups.

— При правильной конфигурации статика будет отдаваться, даже если нет свободных worker-ов.

13

Page 14: Веб-сервер Phantom

А если добавить еще один тип запросов?

14

Page 15: Веб-сервер Phantom

Например

15

Page 16: Веб-сервер Phantom

Это работает.

16

Page 17: Веб-сервер Phantom

Но это неудобно.

17

Page 18: Веб-сервер Phantom

Мы решили сделать свой web-server, лишенный этих

неудобств.

18

Page 19: Веб-сервер Phantom

Phantom

19

Page 20: Веб-сервер Phantom

• Конечный автомат (FSM)

• EPOLL-based

• Coroutine и continuations

• Написан from scratch

• Сильно оптимизирован

Phantom

20

Page 21: Веб-сервер Phantom

• Не совсем честный FSM

• Worker thread-ы можно групировать в пулы

• Пулы можно привязывать к процессорам

• Обработку разных типов запросов можно отдавать в разные пулы

• Pure C++! :)

Phantom

21

Page 22: Веб-сервер Phantom

Как устроен?

22

Page 23: Веб-сервер Phantom

Две основных абстракцииPhantom

— Планировщик выполнения

— Нить выполнения

23

Page 24: Веб-сервер Phantom

Планировщик выполнения

24

Page 25: Веб-сервер Phantom

Описание шедулеров

scheduler_t fast_scheduler = scheduler_simple_t {

threads = 1

event_buf_size = 1000

timeout_prec = 1

policy = fifo

priority = 98

}

25

Page 26: Веб-сервер Phantom

Описание шедулеров

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

Page 27: Веб-сервер Phantom

Привязка путей к хэндлерам

host = {

"test.yandex.ru" : {

path = {

"/fast" : { handler = fast_handler }

"/medium" : { handler = medium_handler }

"/heavy" : { handler = heavy_handler }

}

}

27

Page 28: Веб-сервер Phantom

Привязка хэндлеров к шедулерам

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

Page 29: Веб-сервер Phantom

Профит!

29

Page 30: Веб-сервер Phantom

Нить выполнения

- принять соединение- изготовить continuation- передать его протоколлеру

- распарсить запрос- переложить continuation в соответствующий scheduler- передать управление соответствующему хэндлеру

30

Page 31: Веб-сервер Phantom

Что в комплекте?

31

Page 32: Веб-сервер Phantom

Написав прототип, мы столкнулись с проблемой его

тестирования для дальнейшей оптимизации.

32

Page 33: Веб-сервер Phantom

И ещё раньше чем мы научили phantom отвечать на запросы, мы научили его их

задавать.

33

Page 34: Веб-сервер Phantom

Для этого пришлось написать отдельный модуль,

использовав уже существующий планировщик.

34

Page 35: Веб-сервер Phantom

Нить выполнения

- изготовить необходимое количество continuation-ов- передать их протоколлеру

- вычитать запрос из лога- отправить запрос если пришло время- вычитать и распарсить ответ- обновить статистику

35

Page 36: Веб-сервер Phantom

Инструмент для нагрузочного тестирования

Phantom

— Поддержка любых stateless-протоколов

— Равномерность создаваемой нагрузки

— Высокая производительность

— На его основе написан фреймворк для нагрузочного тестирования - Lunapark

36

Page 37: Веб-сервер Phantom

Пример запроса

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

Page 38: Веб-сервер Phantom

Немного картинок

38

Page 39: Веб-сервер Phantom

50000 RPS ~ 2ms/request

39

Page 40: Веб-сервер Phantom

Конфигурация с двумя scheduler-ами

40

Page 41: Веб-сервер Phantom

Тяжелые запросы в одном scheduler-е

41

Page 42: Веб-сервер Phantom

Легкие запросы в другом

42

Page 43: Веб-сервер Phantom

Ура!Вопросы!

43

Page 44: Веб-сервер Phantom

Phantom будет выложен в opensource.

44

Page 45: Веб-сервер Phantom

Как только мы допишем поддержку FastCGI. :)

Page 46: Веб-сервер Phantom

phantom

46

Page 47: Веб-сервер Phantom

Лѐгкий веб-сервер :)

47

Page 48: Веб-сервер Phantom

nginx vs phantom

48

Page 49: Веб-сервер Phantom

Системный администратор

119021, Россия, Москва,

ул. Льва Толстого, 16.

+7 (495) 739-00-00

+7 (495) 739-70-70 — факс

[email protected]

Влад Селиверстов