代码改变世界

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)

 

从节点:

需要先停止从节点,以单节点的方式运行,然后按照上面的步骤执行操作。然后重启将节点假如复制集。