我正在努力了解如何更好地确定问题与我目前所看到的问题的关系.
目前我正在通过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)
我会说我已经删除了安全写入,并且我已经看到超时发生的急剧减少,所以现在我正在粉碎它(除非插入有什么问题......)
感谢您的时间和想法.
您是否达到了 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