2013-07-24 70 views
0

我正在使用pecl mongo 1.4.x驱动程序(http://pecl.php.net/package/mongo/1.4.1),并在中等流量服务(每分钟5K-10K请求)上标题中提到的设置。在PHP54 + Nginx + PHPFPM + MongoDB中持久连接或连接池

而且我发现,在mongoDB中,Auth命令占用了大量的流量,并且连接请求率如每秒30-50。

这会影响性能严重(锁定比例最高,内存管理没有很好地警察)

如果我在一个盒子里(我有总共5-8盒)做netstat的,我看到的2-总共3K个mongo连接(有些在WAIT中,一些在ESTABLISHED中)每个盒子。

我的问题是我如何减少连接到mongoDB,如何正确设置持久连接?

似乎在PECL mongoDB Driver中持续连接的方式自1.2和1.3以来一直在变化,它在1.4中的表现略有不同。

这里是我调用客户端与所述驱动器的方式:
$蒙戈=新MongoClient(
为 “host1:11004,主机2:11004”,阵列(
'replicaSet'=> MG_REPLICASET,
'密码'=> “superpasswd”,
'用户名'=> “为myuser”,
'DB'=> “MYDB”,
'日记'=>真实,
“readPreference”=> MongoClient :: RP_SECONDARY_PREFERRED
) );

+0

我没有看到你得到指令做的东西的地方,是建立连接是一个相当大的工作,也是连接应该是默认的执着,所以我不能确定如何/如果您的连接正在gced – Sammaye

+0

很多WAIT状态连接似乎是由于超时限制较小。工人经常被杀死。 –

回答

3

在1.4版本中,所有连接都是持久性的,除非您自己关闭它们 - 您应该从开始,而不是。您将看到来自每个PHP处理单元的每个IP /用户名/密码/数据库组合的连接。在你的情况下,每个PHPFPM进程。为了减少连接数量,您需要减少用户名/密码/数据库组合。但是,在复制套件中有8个盒子,50个FPM流程和3个节点,您已经拥有1200个连接 - 甚至没有考虑到数据库/用户名/密码的差异。关于没有太多可以做的事情,但它在性能上应该不会有太大的影响。你更有可能达到内存/慢速磁盘限制。

0

我想我找到了一个解决方案,以避免非常mongo连接请求。

我们需要将PHP_FCGI_MAX_REQUESTS(或pm.max_requests在php-fpm中)设置为一个更大的数字,所以这个过程不会经常回收。

另外,我需要确保pm.request_terminate_timeout不是太小,所以工作人员不会经常被杀死。