2016-08-19 48 views
2

我有这种非常特殊的情况,我需要一台机器来服务大量的MongoDB数据库(例如10k +),并且每个用户都应该能够直接连接到它。 我们的机器非常强大,它运行良好一段时间,直到几天,当它开始导致一些问题。Maxing out MongoDB连接

在某些时候则用户无法登录,我得到这个从mongoS日志:

2016-08-19T18:08:16.667+0000 I NETWORK [mongosMain] pthread_create failed: errno:11 Resource temporarily unavailable 

我试图改变大多数参数的MongoDB明智和聪明,但没有运气:

net.netfilter.nf_conntrack_max is 524288 
fs.file-max is 128000 
kernel.pid_max is 288000 

/etc/security/limits.d/90-nproc.conf有: *软NPROC 128000 *硬NPROC 128000

/etc/init/mongos.conf有:

limit fsize unlimited unlimited 
limit cpu unlimited unlimited 
limit as unlimited unlimited 
limit nofile 512000 512000 
limit rss unlimited unlimited 
limit nproc unlimited unlimited 
limit memlock unlimited unlimited 

但仍然没有运气。

有没有办法让我像100K +连接一样处理?

预先感谢您。

回答

0

嗨它看起来像Linux服务器运行在资源限制。

有关于Linux调谐好文章,接受高F数F连接here

连接跟踪

我们看第二个参数是连接跟踪。这是使用iptables的一个 副作用。由于iptables需要允许在建立的HTTP和ssh连接之间进行双向 通信,因此它需要 来跟踪哪些连接已建立,并将这些 放入连接跟踪表中。此表增长。并增长。并且 增长。

您可以看到使用的sysctl net.netfilter.nf_conntrack_count和使用的sysctl net.nf_conntrack_max极限此表的当前大小。如果计数超过最大值,你的linux系统将停止接受新的TCP连接,你永远不会知道这一点。 这种情况发生的唯一迹象是隐藏了一行 /var/log/syslog中的某处,表示您无法连接 跟踪条目。一行,一次,第一次发生。

更好的指示是如果计数总是非常接近最大值。你可能会想:“嘿,我们已经设置了最大的正确率。”,但你会错的。

你需要做什么(或至少这是你首先想到的)是 增加最大值。

请注意,尽管此值越大,内核将用于跟踪这些条目的内存就越多。内存可以由您的应用程序使用 。

我们开始走下这条路,增加了net.nf_conntrack_max,但是我们只是每天都在推动它。在 中获得的连接从未脱离。

1

我结束了这些设置,这似乎解决了这个问题,但产生一个新问题:机器现在支持超过10万的连接,但似乎最终还是会消耗一定量的RAM,这是不值得的。我们最终添加了服务器以彻底解决问题。

万一有人需要它:

net.netfilter.nf_conntrack_max is 524288 
net.netfilter.nf_conntrack_tcp_timeout_established=600 
fs.file-max is 524288 
kernel.pid_max is 524288 
net.netfilter.nf_conntrack_tcp_timeout_time_wait=1 
net.ipv4.tcp_tw_recycle=0 
vm.max_map_count=524288 

希望它可以帮助别人的未来。