Получение 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, а при перезапуске - нет.