1.一个比较老的游戏服维护,关服维护后启动时报错
2.看到关于mongodb的报错,于是去查一下mongodb的日志
Plan executor error during find: FAILURE, stats
3.关于此报错
MongoDB Server中确认了对于Sort排序能够支持的最大内存限制为32M
在排序字段未利用到索引的情况下,若超过32M内存则会被Abort,语句直接返回报错。
4.结论
排序内存限制的问题 MongoDB使用内存进行排序的场景只有是Sort stage,官方文档有说明: If MongoDB can use an index scan to obtain the requested sort order, the result will not include a SORT stage. Otherwise, if MongoDB cannot use the index to sort, the explain result will include a SORT stage. 意思大概是如果MongoDB可以使用索引扫描来进行排序,那么结果将不包括SORT stage。否则如果MongoDB无法使用索引进行排序,那么查询计划将包括SORT stage。 使用索引扫描的效率是远大于直接将结果集放在内存排序的,所以MongoDB为了使查询语句更有效率的执行,限制了 排序内存的使用,因而规定了只能使用 32M,该种考虑是非常合理的。 但也可通过手工调整参数进行修改(不建议): # 比如调大到 128M ## 在线调整 > db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:134217728}) ## 持久到配置文件 setParameter: internalQueryExecMaxBlockingSortBytes: 134217728