我有一个 MongoDB 服务器,它用完了用于打开连接的文件描述符。我更改了 /etc/security/limits.conf 中的设置,以便每个用户的打开文件数的硬限制和软限制均为 65000,并添加了会话需要 pam_limits.so到 /etc/pam.d/su、common-session、common-session-noninteractive、sshd。更改后重新启动服务器。
之后,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 似乎无法使用 limit nofile 行。您需要将 ulimit -n X(其中 X 是您想要的文件描述符)放在脚本关键字后面。
脚本 ulimit -n 60000 端口=27027 ...
我猜测使用预启动块的方法适用于 MongoDB 的更高版本。
另请注意,MongoDB 的连接数有 20,000 个的硬限制,因此即使将文件描述符设置得高于该限制也没有关系。
另一件事是:使用 upstart 脚本启动和停止与重新启动不同。启动和停止在 limit nofile 命令上会抛出错误,而重新启动则不会。