Механизмы c-extensions в erlang
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 г.