Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 了解Mongo在通过锁定百分比保存时超时_Php_Mongodb - Fatal编程技术网

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

Php 了解Mongo在通过锁定百分比保存时超时,php,mongodb,Php,Mongodb,我试图了解如何更好地识别我目前所看到的问题所在 目前,我正在通过cron更新一个集合,每15分钟从第三方供应商下载一次信息(没有问题)。有时我需要进行为期2年的刷新,也就是我看到这个问题的时候 传入的是大约300-600k的结果,我正在使用mongo->collection->save($item);在上,我有所有结果的_id,因此(我认为)快速插入也会被击中 文档大小变化不大,一开始就相当小(12kb~) 我以每请求200次的速度批量下载到第三方服务器,对其进行格式化,然后使用save wit

我试图了解如何更好地识别我目前所看到的问题所在

目前,我正在通过cron更新一个集合,每15分钟从第三方供应商下载一次信息(没有问题)。有时我需要进行为期2年的刷新,也就是我看到这个问题的时候

传入的是大约300-600k的结果,我正在使用mongo->collection->save($item);在上,我有所有结果的_id,因此(我认为)快速插入也会被击中

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

我以每请求200次的速度批量下载到第三方服务器,对其进行格式化,然后使用save with safe insert设置为true将其一次插入到mongo中

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

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

  • Mongo驱动程序:Mongo原生驱动程序1.2.6(来自PHP.net)

我目前使用的是Mongo 2.2.1,带有SSD驱动器和16gb ram

下面是我在插入时遵循的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;
}
我要说的是,我已经删除了安全写入,并且我已经看到超时发生了大幅减少,所以现在我将其归为安全写入(除非插入有问题…)


感谢您的时间和想法。

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

更多信息:


感谢您的回复;我目前使用的是php.net上的Mongo1.2.6本机驱动程序。我看到的确切错误消息是:游标超时(超时:100000,剩余时间:0:0,状态:0)。不确定上述解决方案是否仍然有效?切换到FuelPHP库是否需要更新其使用的调用的代码而不是Mongo驱动程序?非常感谢。Fuel只是本机驱动程序的包装,因此无需切换。写问题和fsync问题仍然适用。非常好,感谢您提供的信息;我会调查并报告的。谢谢你提供的文档,这样我就明白了;您在关闭安全设置并关闭fsync的60秒间隔的情况下进行写入,然后每x写入一次fsync=true写入?或者,您是在执行少量写入操作后发出命令来执行此操作的。另外,我也不确定如何确定这里的X值。再次感谢你的帮助!为什么您认为全速插入的20-30%的合理锁定与游标超时有关?这个锁的百分比实际上应该更高,因为理论上它应该完全被您的写入占用。我不明白,如果你没有做任何涉及游标的事情,为什么会出现游标超时错误(插入当然不会)。引发此异常的PHP驱动程序代码不清楚,似乎在select()时引发此异常返回0,这可能会导致错误抛出此错误,但我对代码不太熟悉,因此无法确定。
MongoCorsOrtimeOutException
在创建光标100秒后使用光标从上一次查询的结果检索数据时发生。所以你不应该在插页上看到。抛出该异常的语句是什么?它在执行安全保存方法调用时超时;当我在插入一个新文档时,会插入一些其他文档的列表。您能提供一些代码吗?这里好像有点不对劲。顺便问一句,你说你正在批量获得200份文档-你是如何获得它们的-它们是否在一个文件中?还是另一个DB?