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

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

Embed Size (px)

DESCRIPTION

 

Citation preview

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

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

Веб-сервер Phantom

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

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

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

• EPOLL-based

• Coroutine и continuations

• Написан from scratch

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

Phantom

20

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

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

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

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

• Pure C++! :)

Phantom

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 — факс

[email protected]

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