大多数类似UNIX的操作系统(包括Linux和macOS)都提供了一种方法来限制和控制基于进程和用户的系统资源(例如线程,文件和网络连接)的使用。这些“ ulimit”可防止单个用户使用过多的系统资源。有时,这些限制的默认值较低,在正常的MongoDB操作过程中可能会导致许多问题。
mongod
并且mongos
每次使用线程和文件描述符跟踪连接并管理内部操作。本节概述了MongoDB的常规资源利用模式。将这些数字与有关您的部署及其使用的实际信息结合使用,以确定理想的ulimit
设置。
mongod
¶mongod
实例使用的每个数据文件都有1个文件描述符
。mongod
当storage.journal.enabled
is 时,实例使用的每个日记文件都有1个文件描述符
true
。mongod
维护与该集合中所有其他成员的连接。ulimit
¶您可以ulimit
在系统提示符下使用命令来检查系统限制,如以下示例所示:
ulimit
指的是针对每个用户的各种资源限制。因此,如果您的mongod
实例是以同时运行多个进程或多个mongod
进程的用户身份执行的,则
可能会看到这些资源的争用。另外,请注意,processes
值(即-u
)是指不同进程和子进程线程的组合数量。
您可以ulimit
通过发出以下格式的命令来更改设置:
ulimit
影响MongoDB性能的“硬”和“软”都有。“硬” ulimit
是指用户可以随时激活的最大进程数。这是上限:没有任何非根进程都不会增加“困难” ulimit
。相反,“软” ulimit
是为会话或进程实际实施的限制,但是任何进程都可以将其增加到“硬” ulimit
最大值。
如果连接数量增加过多,则“软”级别较低ulimit
可能会导致错误。因此,将两个值都设置为推荐值非常重要
。can't create new thread,
closing connection
ulimit
ulimit
除非修改极限值时指定-H
或-S
修饰符,否则将同时修改“硬”和“软”
值。
对于Linux的许多发行版,您可以通过用-n
选项替换输出中任何可能的值来更改值。在macOS上,使用命令。有关在运行的系统上更改系统限制的确切过程,请参阅操作系统文档。ulimit
-a
launchctl limit
更改ulimit
设置后,必须重新启动该过程以利用修改后的设置。您可以使用
/proc
文件系统查看正在运行的进程的当前限制。
根据系统的配置和默认设置,使用系统对系统限制所做的任何更改都ulimit
可能在系统重新启动后恢复。查看发行和操作系统文档以获取更多信息。
红帽企业Linux和CentOS 6和7强制执行一个单独的最大进程限制nproc
,该限制将覆盖ulimit
设置。该值在以下配置文件中定义,具体取决于版本:
版 | 值 | 文件 |
---|---|---|
RHEL / CentOS 7 | 4096 | /etc/security/limits.d/20-nproc.conf |
RHEL / CentOS 6 | 1024 | /etc/security/limits.d/90-nproc.conf |
要nproc
为这些版本配置值,请创建一个名为/etc/security/limits.d/99-mongodb-nproc.conf
new 和
values 的文件以
增加过程限制。有关推荐值,请参见“ 推荐的ulimit设置”。soft nproc
hard nproc
使用RHEL / CentOS 8,nproc
不再需要单独的值。该ulimit
命令足以在RHEL / CentOS 8上配置所需的最大过程值。
ulimit
设置¶对于使用Upstart的Linux发行版,如果您启动mongod
和/或
mongos
实例作为Upstart服务,则可以在服务脚本中指定限制。您可以使用limit
节来实现。
指定推荐的ulimit设置,如以下示例所示:
每个limit
节将“软”限制设置为指定的第一个值,将“硬”限制设置为第二个值。
更改limit
节后,请使用以下形式通过重新启动应用程序服务来确保更改生效:
systemd
¶对于使用的Linux发行版,如果您将实例启动和/或作为服务启动,
则可以在服务脚本systemd
的[Service]
各部分中指定限制。您可以使用资源限制指令来执行此操作。mongod
mongos
systemd
指定推荐的ulimit设置,如以下示例所示:
每个systemd
限制指令将“硬”限制和“软”限制都设置为指定的值。
更改limit
节后,请使用以下形式通过重新启动应用程序服务来确保更改生效:
注意
如果您通过软件包管理器(例如yum
或)
安装了MongoDB apt
,则在安装过程中安装的服务文件已经包含了这些ulimit值。
/proc
文件系统¶注意
本部分仅适用于Linux操作系统。
该/proc
文件系统存储在位于所述文件系统对象的每个进程的限制/proc/<pid>/limits
,其中<pid>
是该过程的PID或进程标识符。您可以使用以下bash
函数为limits
具有给定名称的一个或多个进程返回对象的内容:
您可以将此函数复制并粘贴到当前的Shell会话中,也可以将其作为脚本的一部分加载。通过以下调用之一调用该函数:
[1] | (1,2)如果您运行的MongoDB操作系统将拒绝兑付额外拨款请求的系统上限制虚拟或常驻内存的大小。 |
[2] | 该-m 来的参数ulimit 对内核版本2.4.30相比更近的Linux系统没有任何影响。-m 如果愿意,可以省略。 |