MongoDB最佳性能 - 多少持久连接

时间:2011-09-14 17:34:56

标签: php performance mongodb connection

我在EC2实例上有一个生产服务的mongodb服务器。根据mongodb官方文档,持久数据库连接应始终用于生产。我一直在试验大约50个持久连接,并且在测试时遇到频繁的连接错误(大约33%的时间)。我正在使用此代码:

$pid = 'db_'.rand(1,50);
$mongo = new Mongo("mongodb://{$user}:{$pass}@{$host}", array('persist' => $pid) );

应用程序的一些背景知识,它是一个仍在不断增加的链接跟踪应用程序 - 每小时写入500 - 1k的写入范围,没有什么太疯狂......但是。

我想知道我是否只需要允许更持久的连接?如何确定持久连接与可用服务器资源的正确平衡?

先谢谢大家。

3 个答案:

答案 0 :(得分:5)

最新驱动程序(1.2.0)的persist值为no longer supported

事实是,它从未真正清楚它在典型的Apache + PHP设置中做了什么。 Google网上论坛和其他地方有几条评论要求提供详细信息,但我没有任何证据证明persistpersistent已经过任何深度测试。

相反,它已被“开箱即用”的连接池所取代。连接池在1.2行中显然been through some changes,并添加了MongoPool类。

仍然没有关于池如何与Apache一起工作的详细解释,但至少你不必担心persist

尽管所有这些混乱,我通过PHP驱动程序在单个MongoDB服务器上处理了1000次流量,而没有很多连接问题。

您是否正在捕捉异常?

您能提供有关确切例外的更多详细信息吗?

可能有代码解决方案。

答案 1 :(得分:1)

您是为每个PHP页面请求打开一个新连接,还是使用具有50个持久连接的连接池?如果您每次都打开一个新连接,那么您可能很快就会耗尽资源。

每个连接在服务器上使用一个额外的线程,因此您可能会限制网络连接的线程数,请在/var/lib/mongodb中检查您的服务器日志是否有错误。

如果您正在使用official MongoDB PHP driver,那么就我所知,它应该自动为您处理连接池。如果你从50个独立的客户端连接到Mongo,那么考虑在Mongo前面放一个队列来缓冲写入。

答案 2 :(得分:0)

http://php.net/manual/en/mongo.connecting.php

没有持久连接x1000

执行

大约需要18秒

持久性

......它需要不到0.02秒