Назад | Перейти на главную страницу

Заставить MongoDB использовать максимальное количество открытых файловых дескрипторов в /etc/security/limits.conf

У меня есть сервер MongoDB, на котором заканчиваются файловые дескрипторы для открытых соединений. Я изменил настройки в /etc/security/limits.conf, чтобы каждый пользователь получил жесткое и мягкое ограничение в 65000 открытых файлов, и добавил сеанс требует pam_limits.so в /etc/pam.d/su, common-session, common-session-noninteractive, sshd. После внесения изменений сервер был перезапущен.

После этого ulimit -a дает желаемый результат - максимальное количество дескрипторов файла 65000. Любопытно, однако, хотя каждый процесс, который запускается для любого конкретного пользователя, использует новый дескриптор файла max 65000, любой процесс MongoDB, который запускается (независимо от пользователя), по-прежнему получает только 1024 дескриптора файла max. Я даже попытался открыть текстовый файл как пользователь mongodb, и он использует ограничение в 65000.

Система:

Я использую сценарий выскочки для запуска экземпляра MongoDB, который находится здесь:


    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 

Мне где-то не хватает настройки?

Таким образом, кажется, что MongoDB 1.6.5 не работает со строкой limit nofile. Вам нужно поставить ulimit -n X (где X - это нужные вам файловые дескрипторы) сразу после ключевого слова script.

    script
        ulimit -n 60000
        PORT=27027
...

Я предполагаю, что метод, использующий блок перед запуском, предназначен для более поздних версий MongoDB.

Также обратите внимание, что MongoDB имеет жесткое ограничение в 20000 подключений, поэтому не имеет значения, если вы устанавливаете файловые дескрипторы выше этого значения.

Выяснилось еще одно: запуск и остановка с использованием сценариев выскочки - это не то же самое, что перезапуск. Запуск и остановка вызывали ошибки в команде limit nofile, а перезапуск - нет.