SlideShare a Scribd company logo
И снова Эрланг...
Плана не будет! 
Причины: 
- невозможно впитать язык за два часа, надо 
начать на нем писать 
- невозможно хорошо рассказать о языке за 
два часа и при этом так, чтобы ни у кого не 
болела голова 
- язык — это просто средство выражения 
управления чем-либо, без предметной области 
его обсуждать скучно и бесполезно 
Скажите «Спасибо, кэп!»
Что будет 
Поговорим за задачи 
Посмотрим, каким боком тут поможет Э 
Накачаемся кучей фактов 
...в надежде, что потом это пригодится в 
реальной жизни 
OMG!!! Это же план!
Поговорим за «тяжелые приложения» 
• термина highload не существует, его придумал 
Бунин 
• буржуины оперируют другими терминами 
• High Avaibility Systems (HA) — это любые системы 
с 24/7 и кучей девяток в конце (сюда же и вэбня); 
• High Performance Computing (HPC) — это уже 
про вычисления, съедающие ресурсы без остатка; 
• наверное, есть что-то еще... но нам пока хватит
Поговорим за HPC 
- много потолков (CPU bound, memory bound, 
IO bound); 
- предметная область — непростая; 
- область решений — еще более непростая; 
- цель: максимальная производительность, 
минимальная задержка; 
- 24/7 — как обычно; 
- выжать из железа все возможное (цена +1U 
может быть больше стоимости времени разработчика на 
оптимизацию). 
Примеры: HFT, OLAP, video encoding, DPI.
Своя особая атмосфера 
● ядро (kernel), брысь с моего ядра (core) — cpu 
affinity... но нам нужны таймеры и системные вызовы; 
● память (преаллокация и локальность, huge 
pages, NUMA, пулы структур (слябы), zero 
copy, DMA, дружественность кешу); 
● выполнение (считаем такты, особенности 
компилятора и прыжки в ассемблер, 
неблокирующие алгоритмы, минимум 
системных вызовов, контролируем 
вымывание кеша, помогаем предсказателю 
ветвления); 
...
Своя особая атмосфера - 2 
... 
● контр-интуитивные знания и опыт (будет ли аппаратно 
подпружиненная функция быстрее самописной, 
HyperThreading — плохо, и т.д.); 
● NIH — это нормально (переписанное и написанное 
самостоятельно будет наверняка быстрее и лучше 
вписываться в экосистему проекта); 
● ЗБЧ. Когда операция повторяется миллиард раз, 
выигрыш в миллисекунду приносит неиллюзорный 
бенефит; 
● языки: С/C++ с подпорками и asm {} (без вариантов); 
● спецоборудование (CUDA/OpenCL видео-карты, Xeon 
Phi, TileGX, FPGA).
А что вы будете делать, если дойдете до конца? 
Упираемся головой в одну из границ? 
- рост вглубь (смотрим что еще подкрутить); 
- рост вширь (добавляем ресурсов). 
2 CPU x 8 core + 348GB RAM + 6 x 4Tb— и пока все, что 
можно упихать в 1U. 
Можно — больше, но это уже свое железо, свои патчи к 
ядру, свое производство, свой саппорт, в общем — ну его 
нафик... 
Остается только одно — ставить еще одну железку. И еще 
одну... И еще...
Мухи от котлет 
- этим безобразием надо как-то управлять 
(сообщать конфигурацию) 
- за этим безобразием надо как-то следить 
(собирать статистику) 
Application 
Control plane 
Data plane
А теперь немного уличной магии... 
Если с Data plane все ясно, то с Control plane мы можем 
развлекаться: 
● можно использовать язык высокого уровня; 
● легкий FFI с языком data plane; 
● сетевая прозрачность/простота; 
● легкость интеграции. 
● можно использовать сторонние 
библиотеки/GC/кеды/смузи; 
● можно (но не нужно) падать и терять данные (главное 
— не уронить data plane при этом) 
● при этом не мешало бы горячая смена кода, если вдруг 
понадобятся бантики (а они понадобятся).
И где тут Эрланг? 
Легкие процессы, нет классической смены 
контекста и ее тяжести; 
Непростой, но вполне понятный FFI с Си (порты, 
NIF, C node); 
Сетевая прозрачность и распределенный 
характер; 
Иммутабельность и GC; 
Интроспекция и легкое чтение кода; 
24/7: let it fall, hot code reload; 
Интегрируемость (ASN.1, куча сетевых сервисов и binary 
pattern matching).
Берем Э, ставим в продакшен … PROFIT!! 
* 
* - на самом деле нет. 
Нужно еще понимание, что там под капотом: 
- OTP (Open Telecom Platform) 
- не OTP (bad idea but embeed!) 
.erl + .hrl 
erlc 
.app 
.beam 
.b.ebaemam 
ERTS EPMD 
node@localhost 
EPMD 
EPMD 
EPMD
Декларативность и pattern matching 
- программа не последовательность действий, 
а набор правил 
- какое правило сработало — то и выполняем 
- т.е. такой большой неявный switch/case 
(clause, слоз, набор правил) 
Соответствие образцу (pattern matching) + 
присвоение (про иммутабельность позже): 
- полное 
{ok, Result} = {ok, [1,2,3]} | {ok, undefined} 
- частичное 
{error, _} = {error, notfound} | {error, <<123, 255>>} 
- с допусловиями (guards) 
{ok, IP} where IP =/= {127, 0, 0, 1}
Иммутабельность и GC 
1> P = 1. 
1 
2> P = 2. 
** exception error: no match of right hand side value 2 
vs. 
irb(main):001:0> a = 1 
=> 1 
irb(main):002:0> a = 2 
=> 2 
irb(main):003:0> print a 
2=> nil 
+ все версии значения переменной; 
+ чужой код не подменит значения; 
+ warnings рулят! (возникают 
зачастую из-за ошибки); 
+ простота GC (собираем по выходу 
за границы видимости). 
- работа с большими списками и 
кортежами — ад копирования и 
фрагментация памяти; 
- разработчику трудно 
адаптироваться; 
- имена кончаются, а нумерация 
усложняет понимание и написание; 
- можно наступить в утечку.
Легкие процессы? Wut? 
- process vs. threads vs. green threads vs. erlang processes 
- не процесс, но объект, инкапсулирующий состояние 
(ObjC) 
- OTP — инфраструктура над процессами (супервизоры, 
серверы, конечные автоматы, события, мониторы) 
ppaarreenntt инициализация receive 
State 
spawn(Fun) 
Pid = <0.0 10> 
{...} 
State 
{...} 
{...} 
State 
Fun 
309 w (heap: 233) 
Pid ! Message 
mailbox
Let if fall, hot code reload.. 
- let it fall =/= можно писать с ошибками 
- let it fall =:= «ошибки неизбежны, подстрахуемся на их счет» 
Страховка: OTP-инфраструктура, супервизоры, мониторы 
- немного о релизах 
- горячее обновление: останавливаем мир, трансформируем 
состояние, меняем код, запускаем мир 
- система даже не заметит 
- и можно делать по сети 
- минусы: надо делать аккуратно, надо следить за версиями 
структур и писать трансформеры 
- практика: все предпочитают перезагрузится, для вэба это 
некритично
Интроспекция 
observer:start().
Интегрируемость 
Что уже есть и прям можно брать: 
- SNMP, SSH, SSL, telnet, ASN.1 — в комплекте; 
- LDAP, HTTP (classic + WS), XMPP, AMQP — стороннее; 
- адаптерты к БД (epgsql, eredis, sqlite) — полно; 
- ZMQ, GTK, OpenGL — и это тоже, да. 
Через ports и NIF можно подпихнуть что угодно: 
- библиотеки; 
- unix pipes; 
- shared memory.
Фу-фу-фу 
- корявый синтаксис (надо привыкнуть); 
- особенности GC и масштабирования; 
- небыстрая математика; 
- проблема первого пня.
Пссс... Хочешь немного кода? 
connect(_Con) -> undefine. 
msg(Con, <<"I">>, undefine) -> add(Con); 
msg(Con, <<"L:", Nick/binary>>, undefine) -> 
case enter(Con, Nick) of 
{ok, UState} -> UState; 
error -> undefine 
end; 
msg(Con, <<"P">>, S) when S =/= undefine -> pub(Con, S); 
msg(Con, <<"S">>, S) when S =/= undefine -> stop(Con, S); 
msg(Con, <<"C:", Msg/binary>>, S) when S =/= undefine -> chat(Con, S, Msg); 
msg(_, _, S) -> S. 
close(Con, S) -> rm(Con, S).
Нафик код, архитектура лучше. 
Что нужно сделать, чтобы передать статистику работы data plane в 
control plane? 
Варианты: 
1. data plane сам формирует статистику и передает ее в control plane 
по шине сообщений; 
DP CP 
2. control plane сам забирает статистику из разделяемой памяти data 
plane; 
DP CP 
3. data plane готовит статистику по запросу из control plane. 
DP CP DP CP
Книги 
http://dmkpress.com/ 
http://www.oreilly.com/ 
https://pragprog.com/
Пообщаться 
Google-группы: 
https://groups.google.com/forum/#!forum/erlang-russian 
Jabber-конференции: 
erlang@conference.jabber.ru 
erlang-talks@conference.jabber.ru
Спасибо за внимание! 
Максим Крентовский 
http://devimpress.com 
max@relabs.ru 
mkrentovskiy 
mkrentovskiy

More Related Content

PDF
Erlang, который мы потеряли
PDF
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
PDF
Erlang мгновенное просветление
PDF
Erlang railsclub - 1
PDF
Алексей Туля - А нужен ли вам erlang?
PPT
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
PDF
Там, где Rails не справляются
PPTX
С одним плюсом (Андрей Аксёнов)
Erlang, который мы потеряли
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
Erlang мгновенное просветление
Erlang railsclub - 1
Алексей Туля - А нужен ли вам erlang?
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Там, где Rails не справляются
С одним плюсом (Андрей Аксёнов)

What's hot (20)

PDF
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
PDF
Лев Валкин — Кое-что про Erlang
PPTX
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
PDF
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
PPTX
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
KEY
Что и почему писать на Erlang
PDF
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
PDF
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
PDF
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
PPTX
C++ Core Guidelines
PPTX
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
PPTX
Expert Java Day: Java concurrency
PDF
Опыт использования Erlang в разработке многопользовательской игры
PPTX
Крадущийся сервер, затаившийся диод (Андрей Аксенов)
PPT
04 ос взаимодействие_процессов_1
PPTX
Multithreading in go
PPTX
Управление памятью в CPython
PDF
REPL в Node.js: улучшаем быт разработчик
PDF
PDF
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Лев Валкин — Кое-что про Erlang
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Что и почему писать на Erlang
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
C++ Core Guidelines
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
Expert Java Day: Java concurrency
Опыт использования Erlang в разработке многопользовательской игры
Крадущийся сервер, затаившийся диод (Андрей Аксенов)
04 ос взаимодействие_процессов_1
Multithreading in go
Управление памятью в CPython
REPL в Node.js: улучшаем быт разработчик
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Ad

Similar to GetDev.NET: Снова Эрланг (20)

PPTX
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
PPT
Conflux: GPGPU .NET
PDF
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
PDF
My talk on Salt and Ansible from DevConf 2014
PDF
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
PPTX
Highload++2013: TopGun - архитектура терабитной платформы DPI
PPT
F# функциональный язык "новой" волны
PDF
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
PPTX
F# - функциональный язык «новой» волны
PPTX
Внедрение параллельного рендеринга в игровой движок
PDF
Операционные системы
PDF
Язык параллельного программирования Cray Chapel
PPSX
Conflux: GPGPU для .NET (ADD`2010)
PDF
Rust - GDG DevFest 2016 Nizhny Novgorod
PPTX
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
PPTX
ML on the Edge - Highload++ Siberia 2019
PDF
TMPA-2013 Sartakov: Genode
PDF
Вячеслав Бирюков - Linux инструменты системного администратора
PDF
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
PPT
CUDA Course 2010 at MSU
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Conflux: GPGPU .NET
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
My talk on Salt and Ansible from DevConf 2014
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Highload++2013: TopGun - архитектура терабитной платформы DPI
F# функциональный язык "новой" волны
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
F# - функциональный язык «новой» волны
Внедрение параллельного рендеринга в игровой движок
Операционные системы
Язык параллельного программирования Cray Chapel
Conflux: GPGPU для .NET (ADD`2010)
Rust - GDG DevFest 2016 Nizhny Novgorod
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
ML on the Edge - Highload++ Siberia 2019
TMPA-2013 Sartakov: Genode
Вячеслав Бирюков - Linux инструменты системного администратора
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
CUDA Course 2010 at MSU
Ad

GetDev.NET: Снова Эрланг

  • 2. Плана не будет! Причины: - невозможно впитать язык за два часа, надо начать на нем писать - невозможно хорошо рассказать о языке за два часа и при этом так, чтобы ни у кого не болела голова - язык — это просто средство выражения управления чем-либо, без предметной области его обсуждать скучно и бесполезно Скажите «Спасибо, кэп!»
  • 3. Что будет Поговорим за задачи Посмотрим, каким боком тут поможет Э Накачаемся кучей фактов ...в надежде, что потом это пригодится в реальной жизни OMG!!! Это же план!
  • 4. Поговорим за «тяжелые приложения» • термина highload не существует, его придумал Бунин • буржуины оперируют другими терминами • High Avaibility Systems (HA) — это любые системы с 24/7 и кучей девяток в конце (сюда же и вэбня); • High Performance Computing (HPC) — это уже про вычисления, съедающие ресурсы без остатка; • наверное, есть что-то еще... но нам пока хватит
  • 5. Поговорим за HPC - много потолков (CPU bound, memory bound, IO bound); - предметная область — непростая; - область решений — еще более непростая; - цель: максимальная производительность, минимальная задержка; - 24/7 — как обычно; - выжать из железа все возможное (цена +1U может быть больше стоимости времени разработчика на оптимизацию). Примеры: HFT, OLAP, video encoding, DPI.
  • 6. Своя особая атмосфера ● ядро (kernel), брысь с моего ядра (core) — cpu affinity... но нам нужны таймеры и системные вызовы; ● память (преаллокация и локальность, huge pages, NUMA, пулы структур (слябы), zero copy, DMA, дружественность кешу); ● выполнение (считаем такты, особенности компилятора и прыжки в ассемблер, неблокирующие алгоритмы, минимум системных вызовов, контролируем вымывание кеша, помогаем предсказателю ветвления); ...
  • 7. Своя особая атмосфера - 2 ... ● контр-интуитивные знания и опыт (будет ли аппаратно подпружиненная функция быстрее самописной, HyperThreading — плохо, и т.д.); ● NIH — это нормально (переписанное и написанное самостоятельно будет наверняка быстрее и лучше вписываться в экосистему проекта); ● ЗБЧ. Когда операция повторяется миллиард раз, выигрыш в миллисекунду приносит неиллюзорный бенефит; ● языки: С/C++ с подпорками и asm {} (без вариантов); ● спецоборудование (CUDA/OpenCL видео-карты, Xeon Phi, TileGX, FPGA).
  • 8. А что вы будете делать, если дойдете до конца? Упираемся головой в одну из границ? - рост вглубь (смотрим что еще подкрутить); - рост вширь (добавляем ресурсов). 2 CPU x 8 core + 348GB RAM + 6 x 4Tb— и пока все, что можно упихать в 1U. Можно — больше, но это уже свое железо, свои патчи к ядру, свое производство, свой саппорт, в общем — ну его нафик... Остается только одно — ставить еще одну железку. И еще одну... И еще...
  • 9. Мухи от котлет - этим безобразием надо как-то управлять (сообщать конфигурацию) - за этим безобразием надо как-то следить (собирать статистику) Application Control plane Data plane
  • 10. А теперь немного уличной магии... Если с Data plane все ясно, то с Control plane мы можем развлекаться: ● можно использовать язык высокого уровня; ● легкий FFI с языком data plane; ● сетевая прозрачность/простота; ● легкость интеграции. ● можно использовать сторонние библиотеки/GC/кеды/смузи; ● можно (но не нужно) падать и терять данные (главное — не уронить data plane при этом) ● при этом не мешало бы горячая смена кода, если вдруг понадобятся бантики (а они понадобятся).
  • 11. И где тут Эрланг? Легкие процессы, нет классической смены контекста и ее тяжести; Непростой, но вполне понятный FFI с Си (порты, NIF, C node); Сетевая прозрачность и распределенный характер; Иммутабельность и GC; Интроспекция и легкое чтение кода; 24/7: let it fall, hot code reload; Интегрируемость (ASN.1, куча сетевых сервисов и binary pattern matching).
  • 12. Берем Э, ставим в продакшен … PROFIT!! * * - на самом деле нет. Нужно еще понимание, что там под капотом: - OTP (Open Telecom Platform) - не OTP (bad idea but embeed!) .erl + .hrl erlc .app .beam .b.ebaemam ERTS EPMD node@localhost EPMD EPMD EPMD
  • 13. Декларативность и pattern matching - программа не последовательность действий, а набор правил - какое правило сработало — то и выполняем - т.е. такой большой неявный switch/case (clause, слоз, набор правил) Соответствие образцу (pattern matching) + присвоение (про иммутабельность позже): - полное {ok, Result} = {ok, [1,2,3]} | {ok, undefined} - частичное {error, _} = {error, notfound} | {error, <<123, 255>>} - с допусловиями (guards) {ok, IP} where IP =/= {127, 0, 0, 1}
  • 14. Иммутабельность и GC 1> P = 1. 1 2> P = 2. ** exception error: no match of right hand side value 2 vs. irb(main):001:0> a = 1 => 1 irb(main):002:0> a = 2 => 2 irb(main):003:0> print a 2=> nil + все версии значения переменной; + чужой код не подменит значения; + warnings рулят! (возникают зачастую из-за ошибки); + простота GC (собираем по выходу за границы видимости). - работа с большими списками и кортежами — ад копирования и фрагментация памяти; - разработчику трудно адаптироваться; - имена кончаются, а нумерация усложняет понимание и написание; - можно наступить в утечку.
  • 15. Легкие процессы? Wut? - process vs. threads vs. green threads vs. erlang processes - не процесс, но объект, инкапсулирующий состояние (ObjC) - OTP — инфраструктура над процессами (супервизоры, серверы, конечные автоматы, события, мониторы) ppaarreenntt инициализация receive State spawn(Fun) Pid = <0.0 10> {...} State {...} {...} State Fun 309 w (heap: 233) Pid ! Message mailbox
  • 16. Let if fall, hot code reload.. - let it fall =/= можно писать с ошибками - let it fall =:= «ошибки неизбежны, подстрахуемся на их счет» Страховка: OTP-инфраструктура, супервизоры, мониторы - немного о релизах - горячее обновление: останавливаем мир, трансформируем состояние, меняем код, запускаем мир - система даже не заметит - и можно делать по сети - минусы: надо делать аккуратно, надо следить за версиями структур и писать трансформеры - практика: все предпочитают перезагрузится, для вэба это некритично
  • 18. Интегрируемость Что уже есть и прям можно брать: - SNMP, SSH, SSL, telnet, ASN.1 — в комплекте; - LDAP, HTTP (classic + WS), XMPP, AMQP — стороннее; - адаптерты к БД (epgsql, eredis, sqlite) — полно; - ZMQ, GTK, OpenGL — и это тоже, да. Через ports и NIF можно подпихнуть что угодно: - библиотеки; - unix pipes; - shared memory.
  • 19. Фу-фу-фу - корявый синтаксис (надо привыкнуть); - особенности GC и масштабирования; - небыстрая математика; - проблема первого пня.
  • 20. Пссс... Хочешь немного кода? connect(_Con) -> undefine. msg(Con, <<"I">>, undefine) -> add(Con); msg(Con, <<"L:", Nick/binary>>, undefine) -> case enter(Con, Nick) of {ok, UState} -> UState; error -> undefine end; msg(Con, <<"P">>, S) when S =/= undefine -> pub(Con, S); msg(Con, <<"S">>, S) when S =/= undefine -> stop(Con, S); msg(Con, <<"C:", Msg/binary>>, S) when S =/= undefine -> chat(Con, S, Msg); msg(_, _, S) -> S. close(Con, S) -> rm(Con, S).
  • 21. Нафик код, архитектура лучше. Что нужно сделать, чтобы передать статистику работы data plane в control plane? Варианты: 1. data plane сам формирует статистику и передает ее в control plane по шине сообщений; DP CP 2. control plane сам забирает статистику из разделяемой памяти data plane; DP CP 3. data plane готовит статистику по запросу из control plane. DP CP DP CP
  • 23. Пообщаться Google-группы: https://groups.google.com/forum/#!forum/erlang-russian Jabber-конференции: erlang@conference.jabber.ru erlang-talks@conference.jabber.ru
  • 24. Спасибо за внимание! Максим Крентовский http://devimpress.com max@relabs.ru mkrentovskiy mkrentovskiy