MongoDB Database Profiler
2024-03-18 10:45 abce 阅读(98) 评论(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
> 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
db.setProfilingLevel(1)
在输出结果中,会显示设置前的值和当前的值。比如:
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
was为0,表示之前没有开启;ok为1,表示当前操作设置成了级别1。
数据库开启 profiler 功能后,会在对应的数据库中创建 system.profile
集合。
设置慢查询阈值和取样比例
db.setProfilingLevel( 1, { slowms: 20 } ) db.setProfilingLevel( 1, { sampleRate: 0.42 } )
设置filter
db.setProfilingLevel( 2, { filter: { op: "query", millis: { $gt: 2000 } } } )
关闭 profling
db.setProfilingLevel(0)
实例级别开启
对于测试、开发环境,可以在实例级别开启:
mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5
或者在配置文件中设置:
operationProfiling: mode: <string> #取值有off、slowOp、all slowOpThresholdMs: <int> slowOpSampleRate: <double> filter: <string>
查看Profiler Data
最近10条日志条目:
db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()
查看除了command操作之外的所有操作记录:
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()
查看某个指定集合上的操作:
db.system.profile.find( { ns : 'mydb.test' } ).pretty()
查看操作时间超过5毫秒的操作:
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()
查看某个时间范围内的操作:
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毫秒以上的操作:
show profile
Profiler的开销
开启后对数据库的性能会有所影响。尤其是配置成级别2,或者设置的阈值太低的时候。
此外,还会加大磁盘空间的消耗,因为需要将日志写入到system.profile集合中和mongodb的日志文件中。
system.profile集合
system.profile 集合默认大小是1MB。通常这个大小能存储几千个profile 文档。如果不够,可以按照以下步骤修改该集合的大小。主从节点会有所不同。
主节点:
1.禁用profiling
2.删除system.profile集合
3.创建一个新的system.profile集合
4.重新开启profiling
db.setProfilingLevel(0) db.system.profile.drop() db.createCollection( "system.profile", { capped: true, size:4000000 } ) db.setProfilingLevel(1)
从节点:
需要先停止从节点,以单节点的方式运行,然后按照上面的步骤执行操作。然后重启将节点假如复制集。