June 15th, 2009

Erlang ports

Тем, кому интересна была скорость работы с портами в эрланге. Вот простейший пинг порта, реализованного на окамле. Порт занимается десериализацией Erlang External Term Format и возвращает ответ. Впрочем, в этом случае там с гулькин нос десериализовывать, ибо {ping} он и есть {ping}. Зато видна базовая производительность работы с портами.

4> perftest:comprehensive(1000, fun() -> portserver:ping(comments_diff) end).
Sequential 100 cycles in ~0 seconds (12337 cycles/s)
Sequential 200 cycles in ~0 seconds (2456 cycles/s)
Sequential 1000 cycles in ~0 seconds (8602 cycles/s)
Parallel 2 1000 cycles in ~0 seconds (4304 cycles/s)
Parallel 4 1000 cycles in ~0 seconds (25219 cycles/s)
Parallel 10 1000 cycles in ~0 seconds (5513 cycles/s)
Parallel 100 1000 cycles in ~0 seconds (26553 cycles/s)
[8602,4304,25219,5513,26553]
5> perftest:sequential(100000, fun() -> portserver:ping(comments_diff) end).
Sequential 100000 cycles in ~11 seconds (9132 cycles/s)
9132
6> 


8-25 тысяч раунд-трипов в секунду, устойчиво 9k/s на одном потоке.

Если бы CPU занималось по полной, я бы не удивился — нормальные цифры. Но так как CPU было загружено далеко не полностью, понятно что где-то в районе евент-менеджмента собака зарыта. beam и ocaml грузят проц примерно поровну: 4-6% на каждого. Копать не буду, меня такие цифры устраивают.