目录
MongoDB的Profiler类似MySQL的SlowLog和GeneralLog的结合,通过设置不同的Profiling级别,来决定记录哪些实例执行过的CURD、配置和管理命令。
Profiler会将搜集的内容记录在每个被Profiled的数据库中,名为system.profile的capped集合中。
开启Profiling会对数据库性能造成一定的损耗并占用一定的磁盘空间,设置的Profiling级别越高,资源消耗越大。
Profiling
Profiling级别
- 0 : 禁用Profiling。默认级别
- 1 : 只记录执行时长超过slowms或符合filter过滤规则的命令(SlowLog)
- 2 : 记录所有的操作(GeneralLog)
Profiling的作用域
- slowms和sampleRate的配置是全局配置,会影响所有的database。slowms慢日志阈值也会作用于diagnostic log。
- 通过db.setProfilingLevel()命令启用并设置Profiling级别,还有Profiling的filter过滤规则只影响当前连接的database。
- 通过命令行参数或配置文件指定Profiling级别或filter过滤规则会影响整个实例的所有database。
- 无法在mongos上面启用Profiling,在mongos上设置slowms和sampleRate只会影响diagnostic log。
- 对于Secondary成员,在应用的oplog条目执行时间超过慢日志阈值时,操作会被记录到diagnostic诊断日志中,但是不会被Profiler捕获。
操作Profiling
配置Profiling
## 启用Profiling(启用后Mongo会自动创建system.profile集合)
# 为当前数据库启用Profing并只记录超过慢日志阈值的操作(默认慢日志阈值为100ms)
db.setProfilingLevel(1)
# 为当前数据启用Profiling并设置慢日志阈值为20ms
db.setProfilingLevel( 1, { slowms: 20 } )
# 在mongos上设置slowms慢日志阈值(只会影响diagnostic log)
db.setProfilingLevel( 0, { slowms: 20 } )
# 配置慢日志记录的随机采样率(只随机记录百分之“sampleRate”的慢日志到Profiling日志和诊断日志中;默认为1,采样率100%)
db.setProfilingLevel( 1, { sampleRate: 0.42 } )
# 设置慢日志过滤器filter;只记录执行时间超过2s的query操作
db.setProfilingLevel( 2, { filter: { op: "query", millis: { $gt: 2000 } } } )
获取Profiling配置
db.getProfilingStatus()
关闭Profiling
db.setProfilingLevel(0)
命令行全局配置Profiling
mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5
配置文件全局配置Profiling
# 示例一:
operationProfiling:
mode: slowOp
slowOpThresholdMs: 2000
slowOpSampleRate: 1
filter: '{ op: "query", millis: { $gt: 2000 } }'
# 示例二:
operationProfiling:
mode: slowOp
filter: '{ op: "query", millis: { $gt: 2000 } }'
查看慢日志
# 获取最近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()
# 返回超过5ms的慢日志
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()
# 返回某个时间段内的慢日志
db.system.profile.find( {
ts : {
$gt: new ISODate("2011-07-12T03:00:00Z"),
$lt: new ISODate("2011-07-12T03:40:00Z")
}
}, { user: 0 } ).sort( { millis: -1 } )
修改system.profile容量
system.profile为一个默认大小只有1M的capped集合,通常只能容纳上千条记录。修改system.profile容量的操作如下:
在Primary实例上:
- 关闭Profiling
- 删除system.profile集合
- 创建system.profile集合
- 从新开启Profiling
db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)
对于Seconary实例:
必须先将其踢出副本集,将其作为单实例,然后执行上述修改操作,之后再将其加入到副本集。