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

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

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

система:

  • Ubuntu Maverick
  • MongoDB 1.6.5

Я использую сценарий upstart для запуска экземпляра 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 

Я что-то пропустил?

1 ответ

Решение

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

    скрипт
        ulimit -n 60000
        PORT=27027
...

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

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

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

Другие вопросы по тегам