Громовая проблема стада


В компьютерных науках проблема громогласного стада возникает, когда большое количество процессов или потоков, ожидающих события, пробуждается, когда это событие происходит, но только один процесс может обработать событие. Когда процессы проснутся, каждый из них попытается обработать событие, но победит только один из них. Все процессы будут конкурировать за ресурсы, возможно, замораживая компьютер, пока стадо снова не успокоится. [1]

Ядро Linux сериализует ответы на запросы к одному файловому дескриптору, поэтому пробуждается только один поток или процесс. [2] Для epoll() в версии ядра Linux 4.5 был добавлен флаг EPOLLEXCLUSIVE, поэтому несколько наборов epoll (разные потоки или разные процессы) могут ожидать на одном и том же ресурсе, и только один набор будет разбужен. Для определенных рабочих нагрузок этот флаг может значительно сократить время обработки. [3]

Точно так же в Microsoft Windows порты завершения ввода-вывода могут смягчить проблему громогласного стада, поскольку их можно настроить таким образом, чтобы только один из потоков, ожидающих на порте завершения, просыпался при возникновении события. [4]

В системах, которые полагаются на механизм отсрочки (например , экспоненциальную отсрочку ), клиенты будут повторять неудачные вызовы, ожидая определенное количество времени между последовательными повторными попытками. Чтобы избежать проблемы громоподобного стада, можно целенаправленно ввести джиттер , чтобы нарушить синхронизацию между клиентами, тем самым избегая коллизий. В этом подходе к интервалам ожидания между повторными попытками добавляется случайность, так что клиенты больше не синхронизируются.