MongoDB v3.6.3开启级别2分析后system.profile集合仍为空
我之前排查过类似的问题,结合你的环境(Win10 64位、MongoDB v3.6.3),可以从以下几个方向逐一排查:
检查慢查询阈值是否未命中
MongoDB默认只会记录耗时超过100ms的操作到system.profile里。你可以先执行db.getProfilingStatus()查看当前的阈值设置,如果你的.NET应用执行的查询耗时低于这个值,自然不会被记录。可以临时把阈值设为0来验证:db.setProfilingLevel(2, { slowms: 0 })这样所有操作都会被捕获,再执行一次应用的查询,看看system.profile是否有记录。
确认应用操作的数据库与Profiler开启的数据库一致
MongoDB的Profiling是按数据库维度生效的。你通过db.getProfilingLevel()确认的是当前控制台连接的数据库的级别,但如果你的.NET应用操作的是另一个数据库,一定要切换到对应数据库再执行db.getProfilingLevel(),确保该库的Profiling级别也是2。验证mongod启动参数是否真正生效
有时候启动参数可能因为配置文件冲突或者输入错误没生效。你可以打开mongod的启动日志,搜索包含Profiler的条目,确认是否有类似"msg":"Profiler started","attr":{"level":2,"slowms":100}}的日志,确保--profile 2参数被正确加载。检查system.profile集合是否正常存在
system.profile是MongoDB自动创建的固定集合,但如果之前被手动删除过,它不会自动重建。你可以执行db.system.profile.count()看看集合是否存在,如果返回0且确实有符合条件的操作,可以手动创建:db.createCollection("system.profile", { capped: true, size: 10485760 })这里的10MB是默认的集合大小,符合MongoDB的规范。
确认应用是否连接到了正确的节点
如果你的MongoDB是副本集架构,应用可能连接到了从节点。Profiling默认只在主节点开启,从节点需要单独配置。你可以在应用侧确认连接的节点地址,或者在MongoDB控制台执行db.isMaster()查看当前节点是否为主节点。
内容的提问来源于stack exchange,提问作者Raven

