Введение
Проблема распределения ресурсов в информатике
В информатике проблема "гремящего стада" возникает, когда большое количество процессов или потоков, ожидающих наступления события, пробуждаются при его наступлении, но только один процесс способен обработать это событие. Когда процессы просыпаются, каждый из них пытается обработать событие, но только один преуспевает. Все процессы начинают конкурировать за ресурсы, что может привести к зависанию компьютера, пока "стадо" не успокоится.
In computer science, the thundering herd problem occurs when a large number of processes or threads waiting for an event are awoken when that event occurs, but only one process is able to handle the event. When the processes wake up, they will each try to handle the event, but only one will win. All processes will compete for resources, possibly freezing the computer, until the herd is calmed down again.
Смягчение
Ядро Linux сериализует ответы на запросы к одному файловому дескриптору, поэтому пробуждается только одна нить или процесс. Для epoll в версии 4.5 ядра Linux был добавлен флаг EPOLLEXCLUSIVE. Таким образом, несколько наборов epoll (разные потоки или разные процессы) могут ожидать один и тот же ресурс, и будет пробужден только один набор. Для определенных рабочих нагрузок этот флаг может значительно сократить время обработки. Аналогично, в Microsoft Windows порты завершения ввода-вывода могут смягчить проблему "громоздкого стада", поскольку их можно сконфигурировать таким образом, чтобы при возникновении события пробуждалась только одна из нитей, ожидающих порт завершения. В системах, использующих механизм отката (например, экспоненциальный откат), клиенты будут повторять неудачные вызовы, ожидая определенное время между последовательными попытками. Чтобы избежать проблемы "громоздкого стада", намеренно добавляется джиттер для нарушения синхронизации между клиентами, что позволяет избежать коллизий. В этом подходе случайность вносится в интервалы ожидания между повторными попытками, чтобы клиенты больше не были синхронизированы.