[Moscow.pm] процессы и AnyEvent: быстрая передача данных
Ruslan Zakirov
ruz на bestpractical.com
Чт Янв 13 18:00:42 PST 2011
2011/1/13 Ivan Petrov <i.petro.77.00 на gmail.com>:
>
>> Поделите обработку на несколько очень мелких по времени работы фаз и
>> после обработки каждой фазы возвращайте управление в AnyEvent. Так
>> решает подобную задачу тот же nginx.
>
> Хороший путь но не всегда рабочий.
>
> я отдаю вебстранички. как в любой системе получается несколько стадий:
> выборка направления движения-обработки (контроллер), выборка данных
> (модель), выдача данных (отображение). На более мелкие фазы как-то не
> бъется.
>
> то есть если например идет сборка html из темплейта то ее уже сложно побить,
> разве что свой темплейтный адаптер ваять.
Если идет сборка HTML из шаблона и шаблонизатор читает файлы с диска
сам, то скорее всего он блокирующий, что конечно же идет в разрез
event loop'ом. Делайте через fork. Как AnyEvent::DBI. Туда storable
hash с данными, обратно html. Конечно же вы потеряете на сериализации,
передаче, десериализации и обратном процессе, но это позволит не
блокировать ваш loop.
Можно переписать шаблонизатор и сделать его не блокирующим.
При определенных условиях можно из блокируещего шаблонизатора сделать
не блокирующий. Если шаблонизатор поддерживает передачу шаблона, а не
имени файла, то можно читать через AIO предварительно шаблон и
передававать его. Если в шаблонизаторе поддерживаются вкулючения
других шаблонов из файлов, то можно перейти на свой синтаксис
включения. Сначала парсить шаблон шаблонизатором, потом парсить
самостоятельно на предмет включений и получать файлы через AIO. И т.д.
и т.п.
В идеальной ситуации, все опереции ввода вывода не блокирующие. Далее
все упирается в CPU. Предела вы достигаете, когда у вас CPU жрется на
100%. Количество процессов c loop'ом должно соответствовать количеству
CPU или быть меньше. В теории добавление процессов только замедлит
работу так как шедулер ядра начнет делить один CPU между несколькими
CPU интенсивными процессами, что позитивно не скажется на пропускной
способности.
Если речь идет о том что один запрос требует много CPU и все
остальные ждут пока он вернет управление в loop. То тут можно только
дробить задачу и периодически возвращаться к обработке других событий.
Это только уменьшит задержки для остальных клиентов, но никак не
повысит общую производительность. Если ваш CPU может подсчитать только
10 полных заданий за 1 секунду и при этом задача не нуждается в IO, то
вы можете обрабатывать 10 запросов в секунду * кол-во CPU и не более.
Все это теория и пока мой AnyEvent проект не ушел в продакшен, но
уйдет в этом месяце и там я уд точно столкнусь с практикой и возможно
пменяю свое мнение на диаметральное.
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
--
Best regards, Ruslan.
Подробная информация о списке рассылки Moscow-pm