【问题标题】:Persistent connection or connection pooling in PHP54+ Nginx + PHPFPM + MongoDBPHP54+ Nginx + PHPFPM + MongoDB中的持久连接或连接池
【发布时间】:2013-07-30 13:39:12
【问题描述】:

我正在使用 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 连接(有些在等待,有些在 ESTABLISHED)。

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

从 1.2 到 1.3,PECL mongoDB 驱动程序中的持久连接工作方式似乎一直在发生变化,并且在 1.4 中的执行方式略有不同。

这是我使用驱动程序调用客户端的方式:
$mongo = 新的 MongoClient(
"host1:11004,host2:11004", 数组(
'replicaSet' => MG_REPLICASET,
'密码'=>“超级密码”,
'用户名'=>“我的用户”,
'db'=>"mydb",
'日记' => 真的,
"readPreference"=> MongoClient::RP_SECONDARY_PREFERRED
) );

【问题讨论】:

  • 我没有看到你得到指示去做事情的地方,是的,建立连接是一项相当大的工作,而且默认情况下连接应该是持久的,所以我不确定你的连接如何/是否被gced
  • 很多等待状态的连接似乎是因为超时限制很小。工人们经常被杀。

标签: mongodb connection-pooling php pecl


【解决方案1】:

在 1.4 版本中,所有连接都是持久的,除非您自己关闭它们 - 您应该永远不要这样做。您将看到来自每个 PHP 处理单元的每个 IP/用户名/密码/数据库组合的连接。在您的情况下,每个 PHPFPM 进程。为了减少连接数,您需要使用较少的用户名/密码/数据库组合。但是,如果您的副本集中有 8 个盒子、50 个 FPM 进程和 3 个节点,那么您已经有 1200 个连接 - 甚至没有考虑数据库/用户名/密码的差异。对于那个,您无能为力,但它对性能的影响应该不大。您更有可能遇到 RAM/慢速磁盘限制。

【讨论】:

    【解决方案2】:

    我想我找到了避免过多 mongo 连接请求的解决方案。

    我们需要将 PHP_FCGI_MAX_REQUESTS(或 php-fpm 中的 pm.max_requests)设置为更大的数字,这样进程就不会太频繁地回收。

    我还需要确保 pm.request_terminate_timeout 不会太小,这样工人就不会经常被杀死。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 2014-04-28
      • 2017-07-12
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      相关资源
      最近更新 更多