Amazon Linux上的Mongo 3.4 - 最大同时连接在4077停止

时间:2018-04-04 07:12:39

标签: mongodb amazon-ec2

我在 t2.micro EC2实例上运行 mongoDB 3.4 (Amazon Linux 2.0(2017.12)) 以下是实例中的ulimit -a配置。

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3867
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 50000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3867
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

您可以看到设置的打开文件数为50000。 所以我预计mongo将允许近50000个连接到正在运行的mongo实例。但我无法同时获得超过4077个连接。在/var/log/mongodb/mongod.log我可以看到当前打开的连接是4077并且新连接被拒绝,因为它无法为新的连接请求创建线程。 我甚至无法从终端连接到mongo shell。它无法创建套接字。如果我发布现在打开的4077连接,我可以连接到数据库。

如何在mongo配置文件中指定最大同时连接数?我是否更改了操作系统环境中的任何其他参数,如ulimit

1 个答案:

答案 0 :(得分:1)

  

我可以看到当前打开的连接是4077,并且新连接被拒绝,因为它无法为新的连接请求创建线程。

t2.micro实例仅提供1GiB的RAM。每个数据库连接都将use up to 1 MB of RAM,因此使用4000多个连接时,您可能已经耗尽了服务器的可用资源。假设您在MongoDB 3.4中使用默认的WiredTiger存储引擎,默认情况下您可能有256MB的RAM分配给WiredTiger缓存,剩余的内存必须在连接线程,O / S和任何其他临时内存分配之间共享mongod

  

如何在mongo配置文件中指定最大同时连接数?我是否更改了操作系统环境中的任何其他参数,如ulimit

资源限制旨在强加一个合理的上限,以便系统管理员可以在系统无响应之前进行干预。连接限制有两种常规类别:MongoDB服务器配置(在本例中为net.maxIncomingConnections)和操作系统强加的限制(ulimit -a)。

在MongoDB 3.4中,net.maxIncomingConnections默认为65,536个并发连接,因此在连接限制之前通常会达到文件或线程的ulimit设置。

对于容量大于t2.micro的服务器,通常从默认值增加限制是有意义的。但是,鉴于t2.micro实例的资源有限,如果您希望部署稳定,我实际上会建议减少限制。

例如,更现实的限制是将net.maxIncomingConnections设置为100个连接(或连接的预期最大100MB RAM)。在您的情况下,您的目标是50,000个连接,因此您可以设置该值或保留默认值(65,536)并依赖ulimit限制。

您的ulimit设置已经允许比您的实例可以合理应对的消耗更多,但如果您想Review and Set Resource Limits,MongoDB手册会有参考。您可以考虑增加-u值(最大进程/线程),因为这可能是您正在达到的当前上限,但与连接一样,我会考虑在给定可用资源和工作负载的情况下这是合理的。