eventmachine: структура evented-приложений

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

Upload: -

Post on 13-Jan-2017

75 views

Category:

Data & Analytics


0 download

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 рабочих процессов.