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