我使用的是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连接(一些在等待,一些在建立)。
我的问题是如何减少连接到mongoDB的数量,如何正确地建立持久连接?
似乎PECL mongoDB驱动程序中的持久连接工作方式从1.2到1.3都发生了变化,在1.4中的表现略有不同。
下面是我使用驱动程序调用客户端的方法:
$mongo = new MongoClient("host1:11004,host2:11004", array('replicaSet' => MG\_REPLICASET,'password'=>"superpasswd",'username'=>"myuser",'db'=>"mydb",'journal' => true,"readPreference"=> MongoClient::RP\_SECONDARY\_PREFERRED) );发布于 2013-07-25 01:05:26
在1.4版本中,所有连接都是持久的,除非您自己关闭它们--您永远不应该这样做。您将看到来自每个PHP处理单元的每个IP/用户名/密码/数据库组合的连接。在您的情况下,每个PHPFPM进程。为了减少连接数量,您需要使用较少的用户名/密码/数据库组合。然而,在你的副本集中有8个盒子,50个FPM进程和3个节点,你已经有了1200个连接--甚至没有考虑数据库/用户名/密码的差异。对此您无能为力,但它应该不会对性能产生太大影响。您更有可能遇到RAM/慢磁盘限制。
发布于 2013-07-30 13:39:12
我想我找到了一个解决方案来避免过多的mongo连接请求。
我们需要设置PHP_FCGI_MAX_REQUESTS (或pmphp-fpm中的max_requests )设置为一个更大的数字,因此该进程不会频繁地循环使用。
此外,我还需要确保pm.request_terminate_timeout不会太小,这样工人就不会经常被杀。
https://stackoverflow.com/questions/17839962
复制相似问题