MongoDB Database Profiler
2024-03-18 10:45 abce 阅读(127) 评论(0) 编辑 收藏 举报本文对应的版本是7.0。
MongoDB 的 Profiler 会将收集到的所有数据写入 system.profile 集合, system.profile 集合是一个 capped 集合,每个开启 profiler 的数据库都会有一个system.profile 集合。
Profiler 默认是关闭的。可以在实例级别或数据库级别开启该功能。开启后对数据库性能和磁盘的使用都会有一定的影响。
开发或测试环境,建议在实例级别开启;但是生产环境,一般不建议从实例级别开启。
Profiler 有个三个设置级别:
·0:关闭 profiler 功能,这是默认的级别,不会收集任何数据
·1:记录超过 slowms 阈值的操作,或者匹配某个 filter 的操作。如果设置 filter,profiler 就不会使用 slowms和 sampleRate的设置,只捕获匹配 filter的操作。
·2:收集所有的操作
开启和配置数据库 profiler
查看 profling
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > db.getProfilingStatus(); { was: 0,##当前状态是未开启 slowms: 100, sampleRate: 1, ok: 1, '$clusterTime' : { clusterTime: Timestamp ({ t: 1710594182, i: 1 }), signature: { hash: Binary (Buffer. from ( "e19a3ce5bcdc3f90876ed09f0910dea258373a0f" , "hex" ), 0), keyId: Long( "7287043562540105729" ) } }, operationTime: Timestamp ({ t: 1710594182, i: 1 }) } |
开启 profling
1 | db.setProfilingLevel(1) |
在输出结果中,会显示设置前的值和当前的值。比如:
1 | { "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 } |
was为0,表示之前没有开启;ok为1,表示当前操作设置成了级别1。
数据库开启 profiler 功能后,会在对应的数据库中创建 system.profile
集合。
设置慢查询阈值和取样比例
1 2 | db.setProfilingLevel( 1, { slowms: 20 } ) db.setProfilingLevel( 1, { sampleRate: 0.42 } ) |
设置filter
1 | db.setProfilingLevel( 2, { filter: { op: "query" , millis: { $gt: 2000 } } } ) |
关闭 profling
1 | db.setProfilingLevel(0) |
实例级别开启
对于测试、开发环境,可以在实例级别开启:
1 | mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5 |
或者在配置文件中设置:
1 2 3 4 5 | operationProfiling: mode: <string> #取值有 off 、slowOp、 all slowOpThresholdMs: < int > slowOpSampleRate: < double > filter: <string> |
查看Profiler Data
最近10条日志条目:
1 | db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty() |
查看除了command操作之外的所有操作记录:
1 | db.system.profile.find( { op: { $ne : 'command' } } ).pretty() |
查看某个指定集合上的操作:
1 | db.system.profile.find( { ns : 'mydb.test' } ).pretty() |
查看操作时间超过5毫秒的操作:
1 | db.system.profile.find( { millis : { $gt : 5 } } ).pretty() |
查看某个时间范围内的操作:
1 2 3 4 5 6 | db.system.profile.find( { ts : { $gt: new ISODate( "2012-12-09T03:00:00Z" ), $lt: new ISODate( "2012-12-09T03:40:00Z" ) } } ).pretty() |
查看最近的5个事件
数据库开启 profling 之后,可以通过show profile 查看最近5条运行超过1毫秒以上的操作:
1 | show profile |
Profiler的开销
开启后对数据库的性能会有所影响。尤其是配置成级别2,或者设置的阈值太低的时候。
此外,还会加大磁盘空间的消耗,因为需要将日志写入到system.profile集合中和mongodb的日志文件中。
system.profile集合
system.profile 集合默认大小是1MB。通常这个大小能存储几千个profile 文档。如果不够,可以按照以下步骤修改该集合的大小。主从节点会有所不同。
主节点:
1.禁用profiling
2.删除system.profile集合
3.创建一个新的system.profile集合
4.重新开启profiling
1 2 3 4 5 6 7 | db.setProfilingLevel(0) db.system.profile. drop () db.createCollection( "system.profile" , { capped: true , size :4000000 } ) db.setProfilingLevel(1) |
从节点:
需要先停止从节点,以单节点的方式运行,然后按照上面的步骤执行操作。然后重启将节点假如复制集。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)