MongoDB慢日志Profiler

目录

Profiling

Profiling级别

Profiling的作用域

操作Profiling

配置Profiling

查看慢日志

修改system.profile容量

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实例上:

  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)

对于Seconary实例:

必须先将其踢出副本集,将其作为单实例,然后执行上述修改操作,之后再将其加入到副本集。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值