Haskell nombres aléatoires soudainement commencer à "converger" après des mois de course

j'ai un programme serveur qui sélectionne au hasard 10 d'un groupe de pairs réseau pour accomplir une tâche. Le code qui génère les indices aléatoires des pairs est le suivant:

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

le programme fonctionne depuis des mois, générant des milliers d '"indices" chaque jour, et a bien fonctionné jusqu'à hier, quand j'ai remarqué que quelque chose avait mal tourné: les nombres aléatoires générés semblent "converger" vers quelques valeurs répétitives (le résultat est que les valeurs correspondantes les pairs du réseau sont lourdement chargés).

pour voir le changement, ci-dessous est de la log du serveur il y a quelques jours:

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

et le journal d'aujourd'hui (comme vous pouvez le voir par les pairs, 53, 37 et 195 sont sélectionnée à plusieurs reprises):

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

le programme tourne sur une version x86_64 D'Ubuntu 10.10.

30
demandé sur Aufheben 2013-08-13 07:40:15

1 réponses

après enquête, il s'avère que c'est un bug embarrassant de ma part: l'utilisateur root sur ce serveur a une limite de fichiers ouverts maximum de 1024, ce qui est inopinément bas (mais j'ai entendu dire que c'est la valeur par défaut sur Ubuntu). Lorsque le programme serveur a trop de sockets ouverts, une partie du système commence à rejeter les pairs, rendant leur statut "inactif". Le véritable "indices":

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

je suis désolé si cette question cause des problèmes ou de la confusion. Je vais essayer de poster plus prudemment la prochaine fois.

10
répondu Aufheben 2013-08-21 03:16:57