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

Pet*_*gad 7 php mongodb

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

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

传入大约300-600k结果我所用的mongo-> collection-> save($ item); 我对所有结果都有_id所以因为(我认为)快速插入而被击中.

文档大小变化不大,开始时相当小(12kb~).

我将每个请求的下载量大约200个批处理到第三方服务器,格式化它们,然后使用save with safe insert设置为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
Run Code Online (Sandbox Code Playgroud)

我有一个主要的辅助设置和一个面向它们的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;
}
Run Code Online (Sandbox Code Playgroud)

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

感谢您的时间和想法.

lan*_*ons 1

您是否达到了 PHP 最大执行限制?您使用哪个 Mongo 库?我使用的是 FuelPHP 的 MongoDb 库,大约 50 次插入将花费近 1 秒(因为每次写入都是经过确认的 fsync 操作),所以这并不令我感到惊讶。我的解决方案是仅在一定的时间间隔进行 fsync 和写入确认,这样可以提供更好的性能,并合理保证不会出现任何问题。

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