- Administration >
- 数据库管理参考 >
- UNIX系统下 ulimit 的设置
UNIX系统下 ulimit 的设置¶
大多类似UNIX的操作系统,包括Linux和OS X,都提供了限制每个进程和每个基本用户使用线程,文件和网络连接等系统资源的一些方法。 “ulimits” 防止单个用户使用太多的系统资源。有时,这些限制的默认值太小,这会导致正常MongoDB操作过程中出现一系列问题。
注解
Red Hat Enterprise Linux和 CentOS 6设置最大进程数为1024,超出了 ulimit 设置。新建一个 /etc/security/limits.d/99-mongodb-nproc.conf 文件,重新设置 soft nproc 和 hard nproc 的值来增加进程限制。具体例子参见 /etc/security/limits.d/90-nproc.conf 。
资源利用¶
mongod 和 mongos 每次使用线程和文件描述符来跟踪连接和管理内部操作。这部分概述了MongoDB中一般的资源利用形式。利用这部分内容,并结合实际的部署和使用来决定合适的 ulimit 设置。
利用一个文件描述符 和 线程来跟踪每个即将到来的连接。
将每个内部线程或 pthread 作为一个系统进程来跟踪。
mongod¶
mongod 实例使用的每个数据文件都有一个文件描述符。
当 storage.journal.enabled 为 true 时, mongod 进程实例使用的每个日志文件都有一个文件描述符。
在复制集中,每个 mongod 保持一个连接复制集中的所有其他集合成员的连接。
mongod 为一些内部进程,如 TTL collections ,复制和复制集健康检查,开启了后台线程。因为这些内部进程需要一部分额外资源。
mongos¶
除了客户端连接的线程和文件描述符, mongos 还必须与所有配置服务器和分片保持连接,该进程包含了所有复制集成员。
关于 mongos 进程,考虑如下行为:
mongos 实例与每个分片都保持一个连接池,所以 mongos 可以重用连接,这样因为不用建立新连接,从而能快速的满足请求。
你可以利用启动参数 maxIncomingConnections 限制连接数。
通过限制连接数,可以防止 mongos 因在 mongod 实例上创建太多连接而产生级联效应。
注解
在 2.6 版更改: MongoDB移除了 maxIncomingConnections 设置值的上限。
回顾和资源限制的设置¶
ulimit¶
注解
“hard” 和 “soft” ulimit 都会影响MongoDB的性能。 “hard” ulimit 是指任何时候单个用户可使用的最大进程数。这是原子性的,非超级用户进程是不能增加 “hard” ulimit 。相反, “soft” ulimit 实际上是驱动一个会话或进程的限制,任何进程都可以增加该参数值达到 “hard” ulimit 的最大值。
如果连接数太多,较低的 “soft” ulimit 会引起 can't create new thread, closing connection 错误。因此,设置合理的*这两个* ulimit 值是非常重要的。
你可以在系统命令行下使用 ulimit 命令查看系统的限制值,比如如下例子:
$ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 192276
-n: file descriptors 21000
-l: locked-in-memory size (kb) 40000
-v: address space (kb) unlimited
-x: file locks unlimited
-i: pending signals 192276
-q: bytes in POSIX msg queues 819200
-e: max nice 30
-r: max rt priority 65
-N 15: unlimited
ulimit 是指每个 user 使用各种资源的限制值。因此,无论你的 mongod 实例是以单个用户多进程执行,还是以多 mongod 进程执行,都可以看到对这些资源的连接。同样,要了解到 processes 值(比如 -u )是指不同进程和子进程线程之和。
你可以按下面形式的命令修改 ulimit 的设置。
ulimit -n <value>
对许多版本的Linux来说,您可以通过 -n 选项代替 ulimit -a 输出的任何值来改变值。在OS X上,使用 launchctl limit 命令。参看您的操作系统文档来改变运行系统的系统限制值。
注解
改变 ulimit 设置之后, 要 重启进程修改值才会有效。通过 /proc 文件可以查看运行进程当前的限制值。
根据您系统配置和默认的设置值,任何使用 ulimit 对系统限制的改变在系统重启后都会恢复到默认值。更多相关信息请参考您的版本和操作系统文档。
/proc File System¶
注解
此部分文档只适合Linux操作系统
/proc 文件存储每个进程的限制值,该文件存放在 /proc/<pid>/limits``形式的文件系统对象。其中 ``<pid> 是进程的 PID 项或进程标识。您可以通过下列 bash 函数返回一个进程或某个进程的 limits 对象内容。
return-limits(){
for process in $@; do
process_pids=`ps -C $process -o pid --no-headers | cut -d " " -f 2`
if [ -z $@ ]; then
echo "[no $process running]"
else
for pid in $process_pids; do
echo "[$process #$pid -- limits]"
cat /proc/$pid/limits
done
fi
done
}
您可以复制粘贴该函数到当前shell下,或者作为脚本的一部分。通过下列调用形式调用该函数。
return-limits mongod
return-limits mongos
return-limits mongod mongos
ulimit值相关推荐¶
每个部署或许都有唯一的要求和设置。然而,下面的阈值和设置对 mongod 和 mongos 部署来说是非常重要的。
-f (文件大小): unlimited
-t (cpu 时间): unlimited
-v (虚拟内存): unlimited [1]
-n (单个进程文件打开数): 64000
-m (内存大小): unlimited [1]
-u (可打开的进程/线程): 64000
修改完 ulimit 值后记得重启 mongod 和 mongos 保证这些值起作用。
[1] | (1, 2) 如果您限制了运行MongoDB系统的虚拟或预留内存大小,那么操作系统将拒绝额外的分配要求。 |