1. Си / Говнокод #20320

    −43

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 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 Июля 2016

    Комментарии (8) RSS

    • SEO-пост
      Ответить
    • идиоты, рандом с экспоненциальным распределением надо использовать для большей эффективности

      ЗЫ в виндовой либе интерфейса к одной встроеной железки, народ после отправки команды делал `Sleep(5)`, (объяснение автора) так как железка все равно быстрее эти команды не может обрабатывать, а с помощью слипа гарантируется равномерное производство.
      Ответить
      • Была похожая история, когда у нас софтварный роутинг в новой версии железки заменили на broadcom'овские чипы. Пакеты стали ходить шустрее, но перестройка таблиц маршрутизации стала медленнее порядка на два. А все приложения любили нагрузку по блейдам балансировать и прочее. Тесты обнаружили, что от этого порой пакеты переставали ходить вовсе. Вот баттхёрт-то был у всех! А вы говорите ольгинские тролли.
        Ответить
        • счастливые пользователи F5 как то раз говорили об опыте до установки F5: до того как ставишь лоад балансинг, у тебя много проблем по всей сети; после того как ставишь лоад балансинг, у тебя много проблем и все они в лоад балансинге. (там народ на F5 просто молился.)
          Ответить

    Добавить комментарий