-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html.slim
242 lines (208 loc) · 10.3 KB
/
index.html.slim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
doctype html
html
head
meta charset='utf-8'
meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'
meta name='viewport' content='width=1024, user-scalable=no'
title
| Erlang talk
link rel='stylesheet' media='screen' href='vendor/deck.js/core/deck.core.css'
link rel='stylesheet' media='screen' href='vendor/deck.js/extensions/goto/deck.goto.css'
link rel='stylesheet' media='screen' href='vendor/deck.js/extensions/menu/deck.menu.css'
link rel='stylesheet' media='screen' href='vendor/deck.js/extensions/navigation/deck.navigation.css'
link rel='stylesheet' media='screen' href='vendor/deck.js/extensions/status/deck.status.css'
link rel='stylesheet' media='screen' href='vendor/deck.js/extensions/scale/deck.scale.css'
link rel='stylesheet' media='screen' href='vendor/deck.js/themes/style/swiss.css'
link rel='stylesheet' media='screen' href='vendor/deck.js/themes/transition/horizontal-slide.css'
link rel='stylesheet' media='print' href='vendor/deck.js/core/print.css'
script src='vendor/deck.js/modernizr.custom.js'
body
.deck-container
section.slide#title
h1
| Байки из большого erlang-проекта
section.slide#big_erlang_project
h2 Большой erlang-проект
ul
li 130 модулей
li 25k loc
li 500 нод
section.slide#riak_core_compare
h2 Для сравнения riak-core
ul
li 96 модулей
li
| 35k loc
sup *
hr
p
sup *
| вместе с комментами
section.slide#baika1
h2
| Первая байка
p
em Задача: 
| есть система управления конфигами, которая должна 
| автоматически подхватывать изменения файлов, парсить их, загружать 
| данные в ets и оповещать об изменениях заинтересованные процессы 
| (тех, кто подписался на изменения)
p
em Проблема: 
| При падении процесса, который хранит данные о подписчиках, ets 
| пересоздается и информация о подписчиках теряется навсегда. 
| Таким образом подписчики никогда не узнают об изменениях конфига
section.slide#baika1_solution
h2 Решение
ul
li опция hire
li первое желание - сделать наследником супервизор
li но у вас не получится - супервизор не может обработать ETS-TRANSFER
li нужен отдельный процесс специально для наследования ets
section.slide#beruang
h2 Beruang
img src="img/beruang.png"
a href="https://github.com/SputnikTeam/beruang"
| https://github.com/SputnikTeam/beruang
section.slide#baika2
h2 Байка вторая. Про логгер
ul
li Самописный логгер
li На макросах
li Умел писать в файл и в скрайб
li Но не одновременно
section.slide#an_hero
img src='img/rescuerangers2.gif'
section.slide#lager_ftw
h2 Lager FTW
ul
li лагер используют почти все
li parse_tranform вместо макросов
li может писать сразу в несколько бэкендов
li
| не умеет писать в скрайб. не беда, напишем 
a href="https://github.com/SputnikTeam/lager_scribe_backend" свой бэкенд для лагера
li выкинул 7 самописных модулуей
li PROFIT!!1
section.slide#lager_problem
h2 Внезапно
ul
li В ходе нагрузочного тестирования была выявлена сильная деградация производительности
li observer показывает что у процесса lager_event растет очередь
section.slide#sad_kitten
img src="img/cute-sad-kitten06.jpg"
section.slide#klarna_investigation
h2 Причины
ul
li внезапно оказалось, что gen_event-хендлеры это не отдельные процессы; они исполняются в контексте менеджера
li чем больше очередь, тем дольше работает file:write
li
| подробности 
a href="http://engineering.klarna.com/article/profiling-and-debugging-complex-erlang-system/" тут
section.slide#lager_solution
h2 Решение
ol
li
| От чуваков из кларны:  
a href="https://github.com/klarna/lager_middleman_backend"
| lager_middleman_backend
li
| Наше решение: limiter
ul
li перед тем как что-то записать в лог, limiter инкрементит счетчик в ets
li сбрасывает счетчики раз в секунду
li если счетчик превысил порог, то limiter дропает сообщение
li если сообщение уникальное, то оно попадает в лог вне зависимости от интенсивности потока
section.slide#baika3
h2 Байка третья. Про обновление эрланга
ul
li У нас была версия 15
li В тот момент как раз зарелизилась версия 17
section.slide#an_hero2
img src='img/rescuerangers2.gif'
section.slide#erts_bug
h2 Внезапно
ul
li В ходе нагрузочного тестирования была выявлена сильная деградация производительности
li Расследование показало, что мы не можем читать из портов
section.slide#despair
img src="img/cute-sad-kitten06.jpg"
section.slide#erts_bug2
h2 Расследование
ul
li Излоировали, повторили
li
| Для воспроизведения необходимы два условия
ol
li писать в порт асинхронно
li писать в порт конкурентно
li Это наш основной кейс. Мы не могли писать в порт ни синхронно, ни из одного процесса
li Повторялся, начиная с версии 16
li
| Запилили тест и 
a href="https://github.com/erlang/otp/pull/440" PR в github
section.slide#success
h2 OTP-12082
pre
| A bug in the VM code implementing sending of signals to ports
could cause the receiving port queue to remain in a busy state
forever. When this state had been reached, processes sending
command signals to the port either got suspended forever, or,
if the nosuspend feature was used, always failed to send to
the port.
In order for this bug to be triggered on a port, one had to at
least once utilize the nosuspend functionality when passing a
signal to the port. This by either calling
-- port_command(Port, Data, [nosuspend | Options]),
-- erlang:send(Port, {PortOwner, {command, Data}}, [nosuspend | Options]),
-- erlang:send_nosuspend(Port, {PortOwner, {command, Data}}), or
-- erlang:send_nosuspend(Port, {PortOwner, {command, Data}}, Options).
Thanks Vasily Demidenok for reporting the issue, and Sergey
Kudryashov for providing a testcase.
section.slide#success_kid
img src="img/success-kid.jpg"
section.slide#sergey
img src="img/sergey.jpg"
section.slide#open-source
h2 Напоследок
ul
li
a href="https://github.com/SputnikTeam/lager_scribe_backend"
| https://github.com/SputnikTeam/lager_scribe_backend
li
a href="https://github.com/SputnikTeam/beruang"
| https://github.com/SputnikTeam/beruang
li
a href="https://github.com/SputnikTeam/rebar_grizzly"
| https://github.com/SputnikTeam/rebar_grizzly
section.slide#end
h2
| Конец
p Twitter: @tank_bohr
br
a href='http://tank-bohr.github.io/erlang_talk/'
| http://tank-bohr.github.io/erlang_talk/
div aria-role='navigation'
a.deck-prev-link href='#' title='Previous'
| ←
a.deck-next-link href='#' title='Next'
| →
p.deck-status aria-role='status'
span.deck-status-current
| /
span.deck-status-total
form.goto-form action='.' method='get'
label for='goto-slide'
| Go to slide:
input#goto-slide type='text' name='slidenum' list='goto-datalist'
datalist#goto-datalist
input type='submit' value='Go'
script src='vendor/deck.js/jquery.min.js'
script src='vendor/deck.js/core/deck.core.js'
script src='vendor/deck.js/extensions/menu/deck.menu.js'
script src='vendor/deck.js/extensions/goto/deck.goto.js'
script src='vendor/deck.js/extensions/status/deck.status.js'
script src='vendor/deck.js/extensions/navigation/deck.navigation.js'
script src='vendor/deck.js/extensions/scale/deck.scale.js'
javascript:
$(function() { $.deck('.slide'); });