Upload
webcrunch
View
1.477
Download
7
Embed Size (px)
DESCRIPTION
Citation preview
О чем разговор?
1. То, что все знают.
2. Почему свой?
3. Как устроен?
4. Что в комплекте?
5. Что получилось?
2
Архитектура веб-сервиса
Frontend:- HTTP-сервер
Backend:- исполняемый код- база данных- сам “сервис”
4
Проблемы?
— Если worker-ов больше чем процессоров —возникает конкуренция за процессор.
— Worker-ы могут блокировать друг-друга.
— Если все worker-ы заблокированы, запросы накапливаются в очереди и ждут, когда освободится worker.
6
Добавим скорости
Accelerator:- “легкий” HTTP-сервер- обрабатывает быстрые запросы- обеспечивает Keep-Alive- проксирует запросы к Frontend-у
7
Профит!
— Запросы поделились на два типа —статика и динамика.
— При правильной конфигурации статика будет отдаваться, даже если нет свободных worker-ов.
10
Не так страшно
— Для привязки worker-процессов к процессорам можно использовать cpu_affinity или cgroups.
— При правильной конфигурации статика будет отдаваться, даже если нет свободных worker-ов.
13
• Конечный автомат (FSM)
• EPOLL-based
• Coroutine и continuations
• Написан from scratch
• Сильно оптимизирован
Phantom
20
• Не совсем честный FSM
• Worker thread-ы можно групировать в пулы
• Пулы можно привязывать к процессорам
• Обработку разных типов запросов можно отдавать в разные пулы
• Pure C++! :)
Phantom
21
Описание шедулеров
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
Нить выполнения
- принять соединение- изготовить continuation- передать его протоколлеру
- распарсить запрос- переложить continuation в соответствующий scheduler- передать управление соответствующему хэндлеру
30
Нить выполнения
- изготовить необходимое количество 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
Системный администратор
119021, Россия, Москва,
ул. Льва Толстого, 16.
+7 (495) 739-00-00
+7 (495) 739-70-70 — факс
Влад Селиверстов