[Moscow.pm] процессы и AnyEvent: быстрая передача данных

Mons Anderson inthrax на gmail.com
Пт Янв 14 06:54:05 PST 2011


И еще скажу вот что:

Если CPU-интенсивность обработки массива данных начинает превышать двойную 
интенсивность сериализации/десериализации, выносите в отдельные процессы 
тяжделую обработку через сериализацию/десериализацию.

причем если, скажем у вас 4 CPU core, то 1 CORE отдать целиком под loop, 3 под 
workers, и задачи воркерам раздавать через очередь (внешнюю, типа beanstalk, 
или внутреннюю на IPC)

в случае внешних очередей вы в дальнейшем можете очень легко вынести 
CPU-intensive tasks на другие N машин.

On Thursday 13 January 2011 10:01:43 Ivan Petrov wrote:
> Есть хорошая технология AnyEvent (на самом деле их множество разных). 
> Когда ваяем какой-либо сервер с использованием этой технологии, то под нее
> довольно хорошо ложится только простая передача контента из сокета в сокет.
> А вот если сюда надо добавить обработку данных, то в зависимости от того
> насколько эта обработка сложная технология может начать хромать на обе
> ноги.
>
> схема:
>
> 1. взяли данные из одного места (AE::io $place, 0 sub {})
> 2. сделали над данными преобразование (тот самый sub)
> 3. отдали их клиенту (AE::io, $client, 1, sub {})
>
> все работает красиво и быстро, пока пункт 2 выполняется быстро. Когда в
> пункте 2 мы делаем например какую-то текстовую обработку данных, то вся
> система понижает время отклика.
>
> хочется спросить у аудитории кто какие пути борьбы с этим знает?
>
> наиболее очевидный - запуск N параллельных процессов, которые работают по
> этой схеме. Получается что это работает сильно лучше форковой схемы (один
> процесс на одного клиента), но в целом тоже может страдать отклик.
> появляется проблема что если один процесс "схватил" несколько клиентов, а
> один из них требует выполнения ресурсоемкого задания, то другой клиент
> будет ждать, хотя мог бы быть обработан
>
> и менее очевидный - вынесение пункта 2 в отдельный (отдельные) процесс и
> тогда обычным AE::io сплавлять ему данные и получать ответ.
>
> но тут встает задача быстрой передачи данных задания в другой процесс.
> сериализация/десериализация сама по себе может оказаться довольно накладной
> вещью и возвращаемся к тому с чего мы начали. А есть ли способ (может на
> базе mmap кто-то делал решение?) быстрой передачи объекта perl между двумя
> процессами? И вообще, кто решал подобные проблемы, поделитесь
> соображениями?



-- 
Vladimir Perepelitsa aka Mons Anderson
<inthrax на gmail.com> / #99779956


Подробная информация о списке рассылки Moscow-pm