Механизмы c-extensions в erlang

Post on 14-Jun-2015

566 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

С-extensions в Erlang

Щербак Ильяинженер-программист

Февраль 2013 www.eltex.nsk.ruсуббота, 9 февраля 13 г.

Что делаем?или сервер видеоконференций (VCS) без батхерта

суббота, 9 февраля 13 г.

Задачи VCS

• Обработка сигнальных потоков• Обработка медиа потоков (media processing)

суббота, 9 февраля 13 г.

• депакетизация• декодирование• процессинг • кодирование• пакетизация

Обработка медиа потока

суббота, 9 февраля 13 г.

Потоки данных в VCS одного потока

H264/AVC 720p@30

депакетизатор-декодер ~2mbit/sдекодер-микшер ~320mbit/sмикшер-енкодер ~320mbit/sенкодер-пакетизатор ~2mbit/s

mp

decoder

rtpdepay

encoder

rtppay

Video mixer

суббота, 9 февраля 13 г.

Erlang?а почему бы и нет...

Erlang OTP

суббота, 9 февраля 13 г.

Erlang это

• легкие, изолированные процессы (~600 байт)

• иммутабельность данных• распределенность• Soft Realtime System

• SMP

суббота, 9 февраля 13 г.

Erlang – не панацеяа жаль...

суббота, 9 февраля 13 г.

Си как средство для реализации

вычислительных задачили средство реализации интерфейса к вычислителю

суббота, 9 февраля 13 г.

Erlang как средство управления абстрактными

вычислителями

суббота, 9 февраля 13 г.

Методы Erlang extensions

• port extensions

• Erlang Distribution Protocol (EDP)

• Native Implemented Function (NIF)

суббота, 9 февраля 13 г.

Методы взаимодействия через port

• взаимодействие с внешним приложением

• кастомный протокол или erl_interfaces

• port driver

суббота, 9 февраля 13 г.

Методы взаимодействия через Erlang DP

• C-node

• Go-node :)

суббота, 9 февраля 13 г.

Взаимодействия через NIF

суббота, 9 февраля 13 г.

Взаимодействие с кодом vs

взаимодействие с приложениемскорость

vs безопасность Erlang VM

суббота, 9 февраля 13 г.

Взаимодействие с приложением

port

process

Erlang VM

OSprocess

data flow

суббота, 9 февраля 13 г.

Взаимодействие с кодом

port

process

Erlang VM

shared library

суббота, 9 февраля 13 г.

Методы вызова Си кодаDriver vs NIF

NIF Driver

контекст исполнения

исполнение в контексте процесса

исполнение в контексте порта

представление данных

internal structures

external term format

исполнения кода

нативное исполнение

по обратному вызову от события

доступ к памяти процесса

прямой доступ к куче

через механизмы VM

суббота, 9 февраля 13 г.

NIF & Driver & Scherduler

NIF и Driver блокируют планировщик

суббота, 9 февраля 13 г.

Что плохого в долгой блокировке

• появляется латентность при реакции на события у процессов находящихся на планировщике

• нагрузка становится менее равномерной

• наблюдается лавинообразный рост памяти при разблокировке

• архитектура Erlang VM подразумевает довольно частое переключение контекстов erlang процессов (reduction budget 2000 и не все BIF атомарны)

суббота, 9 февраля 13 г.

Борьба с long execution

NIF Driver

сделать выполнение долгой задачи прерываемымсделать выполнение долгой задачи прерываемым

выносить исполнение в отдельную нитьвыносить исполнение в отдельную нить

async thread pool

суббота, 9 февраля 13 г.

NIF preemptable

large_workload(Arg) -> case large_workload_nif(Arg) of {continue, Reductions, NewState} -> erlang:bump_reductions(Reductions), large_workload(NewState); {done, Reductions, Result} -> erlang:bump_reductions(Reductions), Result end.

Erlang side

суббота, 9 февраля 13 г.

Асинхронные NIF

large_workload(Arg) -> case large_workload_nif(Arg) of {ok,wait}-> wait_result(); busy -> {error,resource_busy} end.

wait_result()-> receive {done,Result}-> Result; end;

Erlang side

суббота, 9 февраля 13 г.

NIF – самый быстрый способ вызова Си кода

суббота, 9 февраля 13 г.

Природа driver более асинхронна

суббота, 9 февраля 13 г.

Если extension не стабилен – взаимодействие с кодом не для нас

суббота, 9 февраля 13 г.

Недостаток взаимодействия с приложением – оверхед на транспорт данных от вычислителя к Erlang VM

суббота, 9 февраля 13 г.

Конец?

суббота, 9 февраля 13 г.

Не сейчас.

суббота, 9 февраля 13 г.

Shared memory lock-free доступ через private workspace

суббота, 9 февраля 13 г.

Из shared memory в Erlang VM zero-copy mode

суббота, 9 февраля 13 г.

Кастомные аллокаторы и деалокаторы в NIF

#define SIZE 100ErlNifResourceType *resource;static ERL_NIF_TERM sample_nif_function(ErlNifEnv *env,

int argc, const ERL_NIF_TERM argv[]){

void *data = enif_alloc_resource(resource, SIZE); return enif_make_resource(env, data);}

static void x264_destructor(ErlNifEnv *env, void *obj){}

static int load(ErlNifEnv *env, void **priv, ERL_NIF_TERM load_info){ resource = enif_open_resource_type(env, NULL, "resource",

custom_destructor, ERL_NIF_RT_CREATE, NULL);

return 0;}

суббота, 9 февраля 13 г.

Устройство волшебных binary

а также разница между binary, resource_binary и resource

суббота, 9 февраля 13 г.

Гибридная схема

• NIF – управление памятью (пул из shm)

• внешнее приложение – вычислитель

суббота, 9 февраля 13 г.

Гибридная схема

port

process

Erlang VM

OSprocess

Shared memorydatabin

data

суббота, 9 февраля 13 г.

Конец?

суббота, 9 февраля 13 г.

Да

суббота, 9 февраля 13 г.

Спасибо за внимание

С-extensions в Erlang

Февраль 2013 www.eltex.nsk.ruсуббота, 9 февраля 13 г.

top related