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
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
- 1375693866.2663-IO(罚款):收到回复
- 1375693866.2663-IO(精细):获取光标标题
- 1375693866.2663-IO(精细):获取光标主体
- 1375693866.2665-IO(罚款):收到回复
- 1375693866.2665-IO(精细):获取光标标题
- 1375693866.2665-IO(精细):获取光标主体
杀死未完成的游标
,而下一次当它尝试获取游标体时,它会花费大量时间
编辑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
- 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
limit(1)
和limit(n)
其中n<0
是特殊的,因为它们的意思是“给我abs(n)
许多结果,然后关闭光标”
limit(0)
和no limit gived的意思是“给我一个默认的批”——最初的结果是101个文档
现在,在光标被杀死后,37毫秒的速度从何而来仍然是个谜。也许你可以看看你的
mongodb.log
文件是否有任何见解?(如果我看到这些信息,我会再次更新答案)使用驱动程序v1.3.7尝试了您的代码,没有性能下降。请尝试此版本。mycollection
只有20项(没关系,我尝试了包含20K文档和更多文档的集合)。我在不同的服务器上尝试了dbs,但无法摆脱此性能下降。