PHP54 + Nginx + PHPFPM + MongoDB中的持久连接或连接池

时间:2013-07-24 16:39:35

标签: mongodb connection-pooling php pecl

我使用的是pecl mongo 1.4.x驱动程序(http://pecl.php.net/package/mongo/1.4.1),标题中提到的设置适用于中等流量服务(每分钟5K - 10K请求)。

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

这严重影响了性能(锁定率提高,内存管理不能很好地记录)

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

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

PECL mongoDB驱动程序中持续连接的方式似乎从1.2然后1.3开始发生变化,并且在1.4中表现略有不同。

以下是我使用驱动程序调用客户端的方法:
   $ mongo =新的MongoClient(
   “host1:11004,host2:11004”,数组(
   'replicaSet'=> MG_REPLICASET,
   '密码'=> “中superpasswd”,
   '用户名'=> “中为myuser”,
   'DB'=> “中mydb的”,
   'journal'=>如此,
   “readPreference”=> MongoClient :: RP_SECONDARY_PREFERRED
   )    );

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

我们需要将PHP_FCGI_MAX_REQUESTS(或php.fpm中的pm.max_requests)设置为更大的数字,因此该过程不会经常回收。

此外,我需要确保pm.request_terminate_timeout不会太小,因此不会经常杀死工人。