让 MongoDB 在 /etc/security/limits.conf 中使用最大打开文件描述符

让 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 个最大文件描述符的期望结果。但奇怪的是,虽然为任何特定用户启动的每个进程都使用新的文件描述符最大值 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 命令上会抛出错误,而重新启动则不会。

相关内容