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

38
С-extensions в Erlang Щербак Илья инженер-программист Февраль 2013 www.eltex.nsk.ru суббота, 9 февраля 13 г.

Upload: devday

Post on 14-Jun-2015

563 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Механизмы C-extensions в Erlang

С-extensions в Erlang

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

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

Page 2: Механизмы C-extensions в Erlang

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

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

Page 3: Механизмы C-extensions в Erlang

Задачи VCS

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

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

Page 4: Механизмы C-extensions в Erlang

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

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

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

Page 5: Механизмы C-extensions в Erlang

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

H264/AVC 720p@30

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

mp

decoder

rtpdepay

encoder

rtppay

Video mixer

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

Page 6: Механизмы C-extensions в Erlang

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

Erlang OTP

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

Page 7: Механизмы C-extensions в Erlang

Erlang это

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

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

• SMP

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

Page 8: Механизмы C-extensions в Erlang

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

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

Page 9: Механизмы C-extensions в Erlang

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

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

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

Page 10: Механизмы C-extensions в Erlang

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

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

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

Page 11: Механизмы C-extensions в Erlang

Методы Erlang extensions

• port extensions

• Erlang Distribution Protocol (EDP)

• Native Implemented Function (NIF)

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

Page 12: Механизмы C-extensions в Erlang

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

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

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

• port driver

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

Page 13: Механизмы C-extensions в Erlang

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

• C-node

• Go-node :)

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

Page 14: Механизмы C-extensions в Erlang

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

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

Page 15: Механизмы C-extensions в Erlang

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

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

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

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

Page 16: Механизмы C-extensions в Erlang

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

port

process

Erlang VM

OSprocess

data flow

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

Page 17: Механизмы C-extensions в Erlang

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

port

process

Erlang VM

shared library

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

Page 18: Механизмы C-extensions в Erlang

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

NIF Driver

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

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

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

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

internal structures

external term format

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

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

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

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

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

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

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

Page 19: Механизмы C-extensions в Erlang

NIF & Driver & Scherduler

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

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

Page 20: Механизмы C-extensions в Erlang

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

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

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

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

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

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

Page 21: Механизмы C-extensions в Erlang

Борьба с long execution

NIF Driver

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

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

async thread pool

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

Page 22: Механизмы C-extensions в Erlang

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 г.

Page 23: Механизмы C-extensions в Erlang

Асинхронные 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 г.

Page 24: Механизмы C-extensions в Erlang

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

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

Page 25: Механизмы C-extensions в Erlang

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

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

Page 26: Механизмы C-extensions в Erlang

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

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

Page 27: Механизмы C-extensions в Erlang

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

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

Page 28: Механизмы C-extensions в Erlang

Конец?

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

Page 29: Механизмы C-extensions в Erlang

Не сейчас.

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

Page 30: Механизмы C-extensions в Erlang

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

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

Page 31: Механизмы C-extensions в Erlang

Из shared memory в Erlang VM zero-copy mode

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

Page 32: Механизмы C-extensions в Erlang

Кастомные аллокаторы и деалокаторы в 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 г.

Page 33: Механизмы C-extensions в Erlang

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

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

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

Page 34: Механизмы C-extensions в Erlang

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

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

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

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

Page 35: Механизмы C-extensions в Erlang

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

port

process

Erlang VM

OSprocess

Shared memorydatabin

data

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

Page 36: Механизмы C-extensions в Erlang

Конец?

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

Page 37: Механизмы C-extensions в Erlang

Да

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

Page 38: Механизмы C-extensions в Erlang

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

С-extensions в Erlang

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