经过几个月的运行后,Haskell随机数突然开始"收敛"

Auf*_*ben 30 random haskell

我有一个服务器程序,从一组网络对等体中随机选择10来完成任务.生成对等体随机索引的代码如下:

indices = let index = getStdRandom $ randomR (0, number_of_peers - 1)
          in sequence $ replicate 10 index
Run Code Online (Sandbox Code Playgroud)

该程序已经运行了几个月,每天产生数千个"索引",并且一直工作到昨天,当我注意到出现问题时:生成的随机数似乎"收敛"到一些重复值(结果是相应的网络对等体负载很重).

要查看更改,以下是几天前的服务器日志:

peers selected: [55,47,80,74,183,85,04,33,72,58] 
Run Code Online (Sandbox Code Playgroud)

和今天的日志(如你所见,重复选择对等53,37和195):

peers selected: [53,53,37,37,37,37,195,195,195,21] 
Run Code Online (Sandbox Code Playgroud)

该程序在x86_64版本的Ubuntu 10.10上运行.

Auf*_*ben 10

经过调查后发现这是我自己的一个令人尴尬的错误:这个服务器上的root用户有1024个最大打开文件的限制,这意外地低(但我听说这是Ubuntu的默认值).当服务器程序有太多打开的套接字时,系统的某些部分开始拒绝对等体,使其状态为"无效".实际的'指数'是:

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

如果这个问题造成任何麻烦或混乱,我很抱歉.我下次会试着更谨慎地发帖.