我使用的是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
)
);
答案 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不会太小,因此不会经常杀死工人。