Submit Search
Upload
Erlang data operation caveats
•
Download as PPTX, PDF
•
4 likes
•
728 views
Ilya Averyanov
Follow
General mistakes often made by developers new to Erlang
Read less
Read more
Software
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 27
Download now
Recommended
Написание DSL в Perl
Написание DSL в Perl
mayperl
Cocoheads Moscow September
Cocoheads Moscow September
Alexander Zimin
Использование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в Windows
SQALab
Swift School #4
Swift School #4
Sergey Pronin
Функциональные тесты на Perl
Функциональные тесты на Perl
Ilya Zelenchuk
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Yandex
South migration
South migration
AyumuKasuga
Недостатки Python
Недостатки Python
Python Meetup
Recommended
Написание DSL в Perl
Написание DSL в Perl
mayperl
Cocoheads Moscow September
Cocoheads Moscow September
Alexander Zimin
Использование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в Windows
SQALab
Swift School #4
Swift School #4
Sergey Pronin
Функциональные тесты на Perl
Функциональные тесты на Perl
Ilya Zelenchuk
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Yandex
South migration
South migration
AyumuKasuga
Недостатки Python
Недостатки Python
Python Meetup
Kramer
Kramer
anisol
PHP basic
PHP basic
Noveo
ЄВГЕН КЛИМЕНКО «Think like a tester, act like an engineer» Lviv QA Day 2019
ЄВГЕН КЛИМЕНКО «Think like a tester, act like an engineer» Lviv QA Day 2019
QADay
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
Python Meetup
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
Pavel Novitsky
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
2.4 Использование указателей
2.4 Использование указателей
DEVTYPE
Perl 5.10 и 5.12
Perl 5.10 и 5.12
Andrew Shitov
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
Magecom Ukraine
MySQL replication from setup to advanced features. Hidden MySQL replication o...
MySQL replication from setup to advanced features. Hidden MySQL replication o...
Pivorak MeetUp
More Related Content
What's hot
Kramer
Kramer
anisol
PHP basic
PHP basic
Noveo
ЄВГЕН КЛИМЕНКО «Think like a tester, act like an engineer» Lviv QA Day 2019
ЄВГЕН КЛИМЕНКО «Think like a tester, act like an engineer» Lviv QA Day 2019
QADay
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
Python Meetup
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
Pavel Novitsky
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
2.4 Использование указателей
2.4 Использование указателей
DEVTYPE
Perl 5.10 и 5.12
Perl 5.10 и 5.12
Andrew Shitov
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
Magecom Ukraine
MySQL replication from setup to advanced features. Hidden MySQL replication o...
MySQL replication from setup to advanced features. Hidden MySQL replication o...
Pivorak MeetUp
What's hot
(10)
Kramer
Kramer
PHP basic
PHP basic
ЄВГЕН КЛИМЕНКО «Think like a tester, act like an engineer» Lviv QA Day 2019
ЄВГЕН КЛИМЕНКО «Think like a tester, act like an engineer» Lviv QA Day 2019
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
2.4 Использование указателей
2.4 Использование указателей
Perl 5.10 и 5.12
Perl 5.10 и 5.12
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
MySQL replication from setup to advanced features. Hidden MySQL replication o...
MySQL replication from setup to advanced features. Hidden MySQL replication o...
Erlang data operation caveats
1.
Erlang data operation caveats FunBox Илья
Аверьянов
2.
1. Deadlocks
3.
Обращение к самому
себе %%% blacklist.erl handle_call(get_all_blacklisted, _From, #st{all_blacklisted = AllBlacklisted} = St) -> {reply, AllBlacklisted, St}; ... handle_call({is_blacklisted, Word}, _From, St) -> AllBlacklisted = gen_server:call(blacklist, get_all_blacklisted), IsBlacklisted = lists:any(fun(W) -> W =:= Word end, AllBlacklisted), {reply, IsBlacklisted, St};
4.
Взаимное обращение %%% processor.erl ... handle_call({process_job,
Job}, _From, St) -> do_job(Job), gen_server:call(generator, {register_completion, Job}), {reply, true, St}; %%% generator.erl ... handle_call(generate_job, _From, St) -> Job = generate_job(), gen_server:call(generator, {process_job, Job}), {reply, true, St};
5.
Бесконечный timeout gen_server:call(Pid, Message,
infinity) gen_server:call(Pid, Message, 10000) gen_server:call(Pid, Message)
6.
Как найти? erlang:system_info(procs)
7.
2. Bottlenecks
8.
2.1. Явные bottleneck-и
9.
Медленные операции в
gen_server handle_call({calculate_pi, Digits}, _From, St) -> Pi = calculate_pi(Digits), {reply, Pi, St}; handle_call({get_new_files_from_bbs, Boss}, _From, St) -> Files = get_new_files_from_bbs(Boss), {reply, Files, St};
10.
Лишнее копирование данных Плохо is_blacklisted(Word)
-> AllBlacklisted = gen_server:call(BlackListPid, get_all_blacklisted), sets:is_element(Word, AllBlacklisted). handle_call(get_all_blacklisted, _From, #st{all_blacklisted = AllBlacklisted} = St) -> {reply, AllBlacklisted, St};
11.
Хорошо is_blacklisted(Word) -> AllBlacklisted =
gen_server:call({is_blacklisted, Word}). handle_call({is_blacklisted, Word}, _From, #st{all_blacklisted = AllBlacklisted} = St) Result = sets:is_element(Word, AllBlacklisted). {reply, Result, St};
12.
Документация! ● http://www.erlang.org/doc/efficiency_guide/processes.html ● Refc
binaries (не копируются между процессами в рамках одной виртуальной машины) ● Heap binaries (<= 64 bytes) ● ets и dets
13.
2.2 Неявные bottleneck-и
14.
Плохо handle_cast(incr, St =
#st{redis = Redis}) -> spawn_link(fun() -> redis:qp(Redis, "INCR key") end). St.
15.
3. Лишнее копирование См.
2.1.
16.
Более хитрый пример handle_deliver_sm(Pdu,
{Pid, _}, #st{smsc_monitor_pid = SmscMonitorPid} = St) -> smsc_monitor:event(deliver_sm, SmscMonitorPid), event_counter:event(esme_client_deliver_sm), do_handle_deliver_sm(Pid, Pdu, St), {reply, noreply, St}.
17.
handle_deliver_sm(Pdu, {Pid, _},
#st{smsc_monitor_pid = SmscMonitorPid} = St) -> smsc_monitor:event(deliver_sm, SmscMonitorPid), event_counter:event(esme_client_deliver_sm), spawn_link(fun() -> do_handle_deliver_sm(Pid, Pdu, St) end), {reply, noreply, St}.
18.
19.
handle_deliver_sm(Pdu, {Pid, _},
#st{smsc_monitor_pid = SmscMonitorPid} = St) -> smsc_monitor:event(deliver_sm, SmscMonitorPid), event_counter:event(esme_client_deliver_sm), spawn_link(fun() -> do_handle_deliver_sm(Pid, Pdu, St) end), {reply, noreply, St}.
20.
handle_deliver_sm(Pdu, {Pid, _},
#st{smsc_monitor_pid = SmscMonitorPid} = St) -> smsc_monitor:event(deliver_sm, SmscMonitorPid), event_counter:event(esme_client_deliver_sm), LightSt = St#st{reqs = undefined}, spawn_link(fun() -> do_handle_deliver_sm(Pid, Pdu, LightSt) end), {reply, noreply, St}.
21.
Как бороться ● Передавать
в процесс только необходимые ему данные (в рамках функционального стиля) ● Не делать по возможности спаун линк, а использовать другой gen_server с пулом воркеров к нему
22.
3. Memory leaks Локально gen_server:cast(LocalPiCalcPid,
{calculate_pi, Digits}).
23.
На удаленной машине gen_server:cast({PiCalcPid,
remote@node}, {calculate_pi, Digits}).
24.
Как найти и
побороть process_info(Pid), process_info(Pid, memory)
25.
4. IO Плохо case process_job(Job)
of {ok, Res} -> send_job_result(Res); {error, some_noncritical_frequent_error} -> lager:error(“Error: some_noncritical_frequent_error”) end.
26.
Хорошо file:open(Path, [append, raw,
{delayed_write, ?WRITE_BUFFER_SIZE, ?WRITE_BUFFER_MAX_DELAY}])
27.
5. Недостаток ресурсов ●
erl +P 1048576 ● ulimit -n ● no swap!
Download now