- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
Жила-была маленькая либа для некого специфического IPC c Erlang, которую использовали почти все приложениями на большом-пребольшом
кластере. Писалась она во времена, когда эрланг был медленным и на прологе писаным. Использовалась приложениями она как-то так:
...
libFoo_initialize();
for(int i = 0; i<9001; i++) {
libFoo_registerStuff(bar[i]);
}
continue_my_own_business_logic();
...
В этом году обнаружили мы странный разброс нагрузки на разных узлах кластера. Профилировали-профилировали, да нашли следующее:
void libFoo_initialize(void)
{
do_stuff();
int nap = srand(5);
/* Load balancing, prevent simultaneous registration: */
sleep(nap);
}
Таким образом, наша маленькая либа балансировала нагрузку этого кластера, полного матанных приложений, сложной контрольной логики и
fault-tolerance питушни, десятки лет! Само собой, это никто выпиливать не решился, и фикс был следующим:
void libFoo_initialize2(void (*callback)(void))
{
do_stuff();
int nap = srand(5);
/* Load balancing, prevent simultaneous registration: */
sleep(nap);
callback();
sleep(5-nap);
}
Т.е. цикл с libFoo_registerStuff(bar[i]) переносился в этот колбек. Такие дела.
CHayT 03.07.2016 22:50 # −1
inkanus-gray 03.07.2016 23:03 # +2
inkanus-gray 05.07.2016 18:07 # +3
http://svalko.org/575850.html
dxd 05.07.2016 23:09 # 0
guesto 05.07.2016 23:16 # +3
Dummy00001 04.07.2016 11:10 # +3
ЗЫ в виндовой либе интерфейса к одной встроеной железки, народ после отправки команды делал `Sleep(5)`, (объяснение автора) так как железка все равно быстрее эти команды не может обрабатывать, а с помощью слипа гарантируется равномерное производство.
CHayT 30.07.2016 23:12 # +2
Dummy00001 30.07.2016 23:31 # 0