Макс Лапшин - "eventmachine и evented архитектура"

21
Eventmachine Структура evented-приложений

Upload: railsclub

Post on 16-Jun-2015

3.196 views

Category:

Technology


2 download

DESCRIPTION

RailsClub'Moscow (2009.10.04). Макс Лапшин - "EventMachine и evented архитектура"

TRANSCRIPT

Page 1: Макс Лапшин - "EventMachine и evented архитектура"

EventmachineСтруктура evented-приложений

Page 2: Макс Лапшин - "EventMachine и evented архитектура"

fork per requestОтстрел форка на запрос

Page 3: Макс Лапшин - "EventMachine и evented архитектура"

• Раньше была практика форкаться на запрос;

• copy-on-write позволял шарить между процессами код;

• невообразимо медленно, но для модемов нормально.

Page 4: Макс Лапшин - "EventMachine и evented архитектура"

предфоркнутые обработчики

prefork

Page 5: Макс Лапшин - "EventMachine и evented архитектура"

•Apache первой версии, все воркеры держат accept;

•N-воркеров — N одновременных запросов;

•mod_php в безопасности;

•отдача файликов на модемы кладет сервер;

•дорогая межсерверная коммуникация.

Page 6: Макс Лапшин - "EventMachine и evented архитектура"

Вместо процессов нитки

thread pool

Page 7: Макс Лапшин - "EventMachine и evented архитектура"

•Для разделения данных между воркерами, запускаются треды. Те же процессы, но в одном адресном пространстве;

•Проблемы с синхронизацией ниток.

Page 8: Макс Лапшин - "EventMachine и evented архитектура"

новые проблемы

Много клиентов

Page 9: Макс Лапшин - "EventMachine и evented архитектура"

• При большом количестве одновременных запросов начинаются проблемы с шедулингом и переключением контекста;

• время поровну делится на клиентов и пропорционально количеству клиентов замедляется отдача ответа

Page 10: Макс Лапшин - "EventMachine и evented архитектура"

• Нитки отчасти помогают уменьшить стоимость переключения контекста, т.к. не требуют смены адресного пространства

Page 11: Макс Лапшин - "EventMachine и evented архитектура"

• Valgrind и gdb будут сниться ночью. Проезд по памяти осуществляется под нагрузкой и очень плохо отслеживается

Page 12: Макс Лапшин - "EventMachine и evented архитектура"

• Помимо непредсказуемости переключения, нитки неоптимальны по количеству переключений:

• Переключения в данном примере стоило бы делать так:

Page 13: Макс Лапшин - "EventMachine и evented архитектура"

Нитки в Ruby

• Медленные;

• Не утилизируют ядра процессора;

• Реализованы самым неоптимальным способом;

• Основные библиотеки не threadsafe (мало кто вкладывает в это силы).

Page 14: Макс Лапшин - "EventMachine и evented архитектура"

Evented

• Многие сетевые приложения делают частый ввод-вывод и быструю обработку данных (шаблонизация + проверки);

• Операции ввода вывода долгие и с неизвестным временем работы. Чем их ждать, лучше заниматься делом;

• Беда с дисковым вводом-выводом: он на текущий момент на практике синхронный;

• НЕ конечный автомат (FSM);

• Нитки в руби реализованы через вызов select.

Page 15: Макс Лапшин - "EventMachine и evented архитектура"

• Приходящее событие;

• Обработка;

• Запись данных в сокет.

Page 16: Макс Лапшин - "EventMachine и evented архитектура"

EVentmachine

• Стандарт де-факто для Ruby 1.8;

• Ввод данных;

• Готовность к выводу данных;

• Таймер;

• Сигнал от OS (мертвый ребенок, SIGHUP и т.п.).

Page 17: Макс Лапшин - "EventMachine и evented архитектура"

next tick

• Вместо delayed_job можно выполнить долгую операцию после текущего такта работы (на следующем run loop)

Page 18: Макс Лапшин - "EventMachine и evented архитектура"

Проблемы

• Очень тяжело распиливать линейный код на колбеки;

• Использование многоядерности (evented приложения вообще стараются делать однонитевыми).

Page 19: Макс Лапшин - "EventMachine и evented архитектура"

Fibers

• В Ruby 1.9 есть fibers — управляемые пользователем нитки. Coroutines;

• Команда Neverblock портировала их на Ruby 1.8;

• Revactor использует не Eventmachine, а стандарную libev;

• Совмещают удобства ниток и eventmachine.

Page 20: Макс Лапшин - "EventMachine и evented архитектура"

multicore• Руби пока далек от использования многоядерности;

• В 1.9 всё равно есть GIL;

• Возможно альтернативные команды помогут (Rubinius, MacRuby);

• Python тоже использует GIL;

• В Java нитки дорогие (системные, а не зеленые);

• Запускаем процессы по количеству ядер.

Page 21: Макс Лапшин - "EventMachine и evented архитектура"

Выводы

• Fork очень дорогой;

• Не-evented архитектура плохо обслуживает много медленных клиентов;

• EventMachine для руби подходит прекрасно, огромное количество библиотек, всё хорошо;

• Fibers удобнее чем EventMachine, но мало используются;

• Для работы на многих ядрах запускается N рабочих процессов.