Подтвердить что ты не робот

Случайные числа Хаскелла внезапно начинают "сходиться" после нескольких месяцев бега

У меня есть серверная программа, которая случайно выбирает 10 из группы сетевых сверстников для выполнения задачи. Код, который генерирует случайные индексы сверстников, выглядит следующим образом:

indices = let index = getStdRandom $ randomR (0, number_of_peers - 1)
          in sequence $ replicate 10 index

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

Чтобы увидеть изменения, ниже из журнала сервера несколько дней назад:

peers selected: [55,47,80,74,183,85,04,33,72,58] 

и журнал с сегодняшнего дня (как вы можете видеть, одноранговые 53, 37 и 195 неоднократно выбраны):

peers selected: [53,53,37,37,37,37,195,195,195,21] 

Программа работает на версии Ubuntu 10.10 версии x86_64.

4b9b3361

Ответ 1

После расследования это оказывается неловкой ошибкой: пользователь root на этом сервере имеет ограничение на максимальные открытые файлы размером 1024, что неожиданно мало (но я слышал, что это значение по умолчанию для Ubuntu). Когда в серверной программе слишком много открытых сокетов, какая-то часть системы начинает отклонять сверстников, делая их статус "неактивным". Фактические "индексы":

indices = let index = getStdRandom $ randomR (0, M.size active - 1) in
              sequence $ replicate (n * 2) index

Прошу прощения, если этот вопрос вызывает какие-либо проблемы или путаницу. В следующий раз я постараюсь опубликовать более осмотрительно.