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实例: 必须先将其踢出副本集,将其作为单实例,然后执行上述修改操作,之后再将其加入到副本集。