У меня есть сервер 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, а перезапуск - нет.