Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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 非常慢的MongoCursor::next()性能_Php_Performance_Mongodb - Fatal编程技术网

Php 非常慢的MongoCursor::next()性能

Php 非常慢的MongoCursor::next()性能,php,performance,mongodb,Php,Performance,Mongodb,在某些情况下,我面临着极其缓慢的MongoCursor性能 $mongoClient=新的mongoClient('mongodb://127.0.0.1:27017'); $collection=$mc->mydb->mycollection; 测试1: ($i=0;$ifind()->限制(2); $cursor->next(); } 运行时间:41.78210秒[24次/s] 测试2: 用于($i=0;$ifind()->限制(1); $cursor->next(); } 运行时间:

在某些情况下,我面临着极其缓慢的
MongoCursor
性能

$mongoClient=新的mongoClient('mongodb://127.0.0.1:27017');
$collection=$mc->mydb->mycollection;
测试1: ($i=0;$ifind()->限制(2); $cursor->next(); } 运行时间:41.78210秒[24次/s]

测试2:
用于($i=0;$ifind()->限制(1);
$cursor->next();
}
运行时间:0.47898秒[2088次/s]

测试3:
for($i=0;$ifind()->限制(2)->batchSize(-2);
$cursor->next();
}
运行时间:0.65439秒[1528操作/秒]

test1中,无论
limit(2)
还是
limit(200)
脚本始终执行24次操作/s

我用以下方法进行了测试:

  • mongo v2.4.5

  • php驱动程序1.4.0dev和1.5.0dev

  • Debian 6.0.7和Ubuntu 12.10

这是php驱动程序中的问题吗

编辑1: 我通过MongoLog做了一些日志记录,得到了有趣的结果:

MongoLog::setLevel(MongoLog::ALL);
MongoLog::setModule(MongoLog::IO);
test1:(N>1时的限制(N)

  • 1375693731.5349-IO(罚款):收到回复
  • 1375693731.5350-IO(精细):获取光标标题
  • 1375693731.5351-IO(精细):获取光标主体
  • 1375693731.5351-IO(警告):终止未完成的游标63182808988603511
  • 1375693731.5352-IO(罚款):收到回复
  • 1375693731.5353-IO(精细):获取光标标题
  • 1375693731.5726-IO(精细):获取光标主体
  • 1375693731.5727-IO(警告):终止未完成的光标63182981334616260
测试2:(限制(1)、限制(0)和无限制)

  • 1375693866.2663-IO(罚款):收到回复
  • 1375693866.2663-IO(精细):获取光标标题
  • 1375693866.2663-IO(精细):获取光标主体
  • 1375693866.2665-IO(罚款):收到回复
  • 1375693866.2665-IO(精细):获取光标标题
  • 1375693866.2665-IO(精细):获取光标主体
正如您所看到的,当我使用N(其中N>1)限制查询时,驱动程序会
杀死未完成的游标
,而下一次当它尝试获取游标体时,它会花费大量时间

编辑2: 是的,时间安排只涉及20个文档的收集,但20K文档只会影响limit(0)和noLimit,它们会像您所说的那样杀死游标

这是日志级别为5的日志。我没有任何线索

mongodb.log:限制(N)

  • Mon Aug 5 14:43:55.292[conn3]query mydb.mycollection cursorid:1002459676459826 NTORTURN:2 ntoskip:0 nscanned:3 keyUpdates:0 locks(micro)r:84 nRETURN:2 reslen:86 0ms
  • 8月5日星期一14:43:55.293[康涅狄格州3]杀手诅咒:发现1个,共1个
  • 8月5日星期一14:43:55。293[conn3]杀手游标密钥更新:0毫秒
  • 8月5日星期一14:43:55。332[conn3]运行名为mydb.mycollection{}
  • Mon Aug 5 14:43:55.333[conn3]query mydb.mycollection cursorid:1002631131988423 NTORTURN:2 ntoskip:0 nscanned:3 keyUpdates:0 locks(micro)r:84 nRETURN:2 reslen:86 0ms
mongodb.log:限制(1)

  • Mon Aug 5 14:45:54.899[conn3]运行名为mydb.mycollection{}
  • 8月5日星期一14:45:54.899[conn3]查询mydb.mycollection NTORTURN:1 ntoskip:0 nscanned:1 keyUpdates:0锁(微秒)r:39 nRETURN:1 reslen:53 0ms
  • Mon Aug 5 14:45:54.899[conn3]运行名为mydb.mycollection{}
  • Mon Aug 5 14:45:54.899[conn3]query mydb.mycollection ntoreturn:1 ntoskip:0 nscanned:1 keyUpdates:0 locks(micro)r:35 nReturn:1 reslen:53 0ms

我不确定您是如何运行此测试的,也不确定我的集合中有多少项,但无论我有多少项,这三个测试都需要0.102-0.112秒。比您运行的速度快得多。这是PHP 5.4和驱动程序版本1.5.0dev的情况

“Killing unfinished cursor”消息是因为您没有读取属于该游标所指示的结果集的所有找到的数据。我假定您在测试中只使用了20个项,而不是20k,因为这也会显示该消息

默认情况下,从MongoDB读取的第一批是101个文档。因此,如果结果集小于此值,则没有光标

limit(1)
limit(n)
其中
n<0
是特殊的,因为它们的意思是“给我
abs(n)
许多结果,然后关闭光标”

limit(0)
和no limit gived的意思是“给我一个默认的批”——最初的结果是101个文档


现在,在光标被杀死后,37毫秒的速度从何而来仍然是个谜。也许你可以看看你的
mongodb.log
文件是否有任何见解?(如果我看到这些信息,我会再次更新答案)

使用驱动程序v1.3.7尝试了您的代码,没有性能下降。请尝试此版本。
mycollection
只有20项(没关系,我尝试了包含20K文档和更多文档的集合)。我在不同的服务器上尝试了dbs,但无法摆脱此性能下降。