Веб-сервер phantom
DESCRIPTION
При проектировании нагруженных систем приходится сталкиваться с тем, что разные типы запросов к веб-серверам затрачивают разное количество ресурсов, выполняются за разное количество времени и имеют разные приоритеты выполнения. Некоторые запросы «стоят» мало и должны выполняться как можно быстрее. Некоторые «стоят» дорого, и главное, чтобы они не блокировали обработку быстрых запросов. Существующие схемы приоритезации показались нам громоздкими и неудобными – при росте количества типов запросов конфигурация системы усложнялась в разы. Поэтому, чтобы решить эту проблему, а также для того, чтобы сделать ответы на запросы еще более быстрыми, мы написали свой веб-сервер – Phantom. Я расскажу вам, как он устроен, покажу, какие задачи можно решать с его помощью, а в завершение покажу на практике, как работает приоритезация разных типов запросов, используя для этого инструмент нагрузочного тестирования, основанный на Phantom.TRANSCRIPT
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 — факс
Влад Селиверстов