Obtendo o MongoDB para usar o máximo de descritores de arquivos abertos em /etc/security/limits.conf

1

Eu tenho um servidor MongoDB que fica sem descritores de arquivos para conexões abertas. Alterei as configurações em /etc/security/limits.conf para que cada usuário receba um limite rígido e flexível de 65.000 arquivos abertos e uma sessão exigida pam_limits.so para /etc/pam.d/ su, sessão comum, sessão comum não interativa, sshd. O servidor foi reiniciado após as alterações feitas.

Depois, ulimit -a produz o resultado desejado de ter 65.000 descritores de arquivo máximos. Curiosamente, enquanto todo processo que é iniciado para qualquer usuário em particular usa o novo descritor de arquivo máximo de 65000, qualquer processo do MongoDB que inicia (não importa o usuário) ainda recebe apenas 1024 descritores de arquivo máximos. Eu até tentei abrir um arquivo de texto como o usuário mongodb, e isso usa o limite de 65000.

Sistema:

  • Ubuntu Maverick
  • MongoDB 1.6.5

Estou usando um script upstart para iniciar a instância do MongoDB, que está aqui:


    pre-start script
        PORT=27027
        mkdir -p /var/lib/mongodb${PORT}
        mkdir -p /var/log/mongodb
        limit nofile 65000 65000
        limit nproc 65000 65000
    end script

    start on runlevel [2345]
    stop on runlevel [06]

    script
      PORT=27027
      ENABLE_MONGODB="yes"
      if [ -e /var/lib/mongodb${PORT}/mongod.lock ]; then rm /var/lib/mongodb${PORT}/mongod.lock; fi
      if [ ! -d /var/lib/mongodb${PORT} ]; then mkdir -p /var/lib/mongodb${PORT}; fi
      chown -R mongodb:mongodb /var/lib/mongodb${PORT}
      if [ "x$ENABLE_MONGODB" = "xyes" ]; then
            exec start-stop-daemon --start --quiet --chuid mongodb \
            --pidfile /var/lib/mongodb${PORT}/${PORT}.pid \
            --exec /usr/bin/mongod -- \
            --port ${PORT} \
            --dbpath /var/lib/mongodb${PORT} \
            --logpath /var/log/mongodb/mongodb${PORT}.log \
            --logappend  \
            --maxConns = 50000 \
            --replSet oascluster \
            --oplogSize 200 \
            --rest
      fi
    end script

    respawn

    respawn limit 20 30 

Estou sentindo falta de um cenário em algum lugar?

    
por Eugene 29.03.2011 / 21:56

1 resposta

1

Portanto, parece que o MongoDB 1.6.5 não funciona com a linha limite do nofile. Você precisa colocar ulimit -n X (onde X é o descritor de arquivo que você quer) logo após a palavra-chave do script.

    script
        ulimit -n 60000
        PORT=27027
...

Eu acho que o método usando o bloco de pré-inicialização é para versões posteriores do MongoDB.

Além disso, o MongoDB tem um limite rígido de 20.000 conexões, portanto, não importa se você definiu descritores de arquivo mais altos que isso.

Outra coisa aprendida: iniciar e parar usando scripts upstart não é o mesmo que REstarting. Iniciar e parar jogou erros no comando limit nofile, enquanto o reinício não.

    
por 29.03.2011 / 23:50