1. С-extensions в Erlang
Щербак Илья
инженер-программист
Февраль 2013 www.eltex.nsk.ru
суббота, 9 февраля 13 г.
2. Что делаем?
или сервер видеоконференций (VCS) без батхерта
суббота, 9 февраля 13 г.
3. Задачи VCS
• Обработка сигнальных потоков
• Обработка медиа потоков (media processing)
суббота, 9 февраля 13 г.
4. Обработка медиа потока
• депакетизация
• декодирование
• процессинг
• кодирование
• пакетизация
суббота, 9 февраля 13 г.
5. Потоки данных в
mp
VCS одного потока
H264/AVC
720p@30
decoder encoder
депакетизатор-декодер ~2mbit/s
декодер-микшер ~320mbit/s
микшер-енкодер ~320mbit/s
енкодер-пакетизатор ~2mbit/s
rtpdepay rtppay
Video mixer
суббота, 9 февраля 13 г.
6. Erlang OTP
Erlang?
а почему бы и нет...
суббота, 9 февраля 13 г.
7. Erlang это
• легкие, изолированные процессы (~600 байт)
• иммутабельность данных
• распределенность
• Soft Realtime System
• SMP
суббота, 9 февраля 13 г.
8. Erlang – не панацея
а жаль...
суббота, 9 февраля 13 г.
9. Си как средство для
реализации
вычислительных задач
или средство реализации интерфейса к вычислителю
суббота, 9 февраля 13 г.
10. Erlang как средство
управления абстрактными
вычислителями
суббота, 9 февраля 13 г.
11. Методы Erlang
extensions
• port extensions
• Erlang Distribution Protocol (EDP)
• Native Implemented Function (NIF)
суббота, 9 февраля 13 г.
12. Методы взаимодействия
через port
• взаимодействие с внешним приложением
• кастомный протокол или erl_interfaces
• port driver
суббота, 9 февраля 13 г.
13. Методы взаимодействия
через Erlang DP
• C-node
• Go-node :)
суббота, 9 февраля 13 г.
15. Взаимодействие с кодом
vs
взаимодействие с приложением
скорость
vs
безопасность Erlang VM
суббота, 9 февраля 13 г.
16. Взаимодействие с
приложением
process
port
data flow
OS
process
Erlang VM
суббота, 9 февраля 13 г.
17. Взаимодействие с
кодом
process
shared library
port
Erlang VM
суббота, 9 февраля 13 г.
18. Методы вызова Си кода
Driver vs NIF
NIF Driver
контекст исполнение в исполнение в
контексте контексте
исполнения процесса порта
представление internal external term
данных structures format
исполнения по обратному
нативное
вызову от
кода исполнение
события
доступ к памяти прямой доступ через
процесса к куче механизмы VM
суббота, 9 февраля 13 г.
19. NIF & Driver &
Scherduler
NIF и Driver блокируют планировщик
суббота, 9 февраля 13 г.
20. Что плохого в долгой
блокировке
• появляется латентность при реакции на события
у процессов находящихся на планировщике
• нагрузка становится менее равномерной
• наблюдается лавинообразный рост памяти при
разблокировке
• архитектура Erlang VM подразумевает довольно
частое переключение контекстов erlang
процессов (reduction budget 2000 и не все BIF
атомарны)
суббота, 9 февраля 13 г.
21. Борьба с long execution
NIF Driver
сделать выполнение долгой задачи прерываемым
выносить исполнение в отдельную нить
async thread pool
суббота, 9 февраля 13 г.
22. NIF preemptable
Erlang side
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.
суббота, 9 февраля 13 г.
23. Асинхронные NIF
Erlang side
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;
суббота, 9 февраля 13 г.
24. NIF – самый быстрый
способ вызова Си кода
суббота, 9 февраля 13 г.