了解通过锁定百分比保存的Mongo超时

时间:2013-03-01 16:51:24

标签: php mongodb

我正在努力了解如何更好地确定我目前所看到的问题所在。

目前我正在通过cron更新集合,每15分钟从第三方供应商处下载信息(没有问题)。有时我需要做2年的刷新,当我看到这个问题时。

传入大约300-600k结果我正在使用mongo-> collection-> save($ item);我得到了所有结果的_id,因此(我认为)是快速插入的。

文档大小没有太大变化,开始时相当小(12kb~)。

我将每个请求的下载量大约200个批处理到第三方服务器,格式化它们,然后使用save将安全插入设置为true,将它们一次插入mongo。

现在正在进行保存时,它会将我的锁定百分比提高到20-30%之间。我想知道如何追踪为什么会发生这种情况,因为我认为这是我最终达到超时(设置为100秒)的原因。

  • 超时错误:MongoCursorTimeoutException对象 - >游标超时(超时:100000,剩余时间:0:0,状态:0)

  • Mongo驱动程序:Mongo Native Driver 1.2.6(来自PHP.net)

我目前使用的是带有SSD驱动器和16GB内存的Mongo 2.2.1。

以下是插入发生时我遵循的mongoStat操作示例:

  insert  query update delete getmore command flushes mapped  vsize    res        faults                locked db               idx miss %     qr|qw   ar|aw  netIn  netOut  conn  set          repl    time 
  0       0     201    0      215     203     0       156g    313g     1.57g      7                    mydb:36.3%               0               0|0     0|0   892k   918k    52    a-cluster    PRI     10:04:36

我有一个带有辅助设置的主服务器和一个面向它们的arb(根据文档建议),使用PHP来执行我的插入。

任何帮助都会非常受欢迎。

非常感谢你的时间

更新

我将所有项目存储在“MongoDoc”中,因为有时需要对每个元素进行格式化,在将这​​些项目批处理后,我将数据输出并插入为

$mongoData = $mongoSpec->getData();
try {
    foreach($mongoData as $insert) {
        $this->collection_instance->save($insert);
        $count++;
    }
} catch(Exception $e) {
    print_r($e->getTrace());
    exit;
}

我会说我已经删除了安全写入,并且我已经看到超时发生的急剧减少,所以现在我正在粉碎它(除非插入有什么问题..)

感谢您的时间和想法。

1 个答案:

答案 0 :(得分:1)

您是否达到了PHP最大执行限制?您使用的是哪个Mongo库?我使用的是FuelPHP的MongoDb库,只需要大约1秒即可完成约50次插入(因为每次写入都是经过确认的fsync'd操作),所以这并不让我感到惊讶。我的解决方案是fsync并在一定的时间间隔内写入确认,这样可以提供更好的性能,并且可以确保没有出错。

更多信息:
http://docs.mongodb.org/manual/reference/command/fsync/
http://docs.mongodb.org/manual/core/write-operations/#write-concern