前言

数据库事件探查器收集有关针对正在运行的mongod实例执行的数据库命令的详细信息。这包括CRUD操作以及配置和管理命令。探查器将其收集的所有数据写入到system.profile集合中,该数据库是admin数据库中的上限集合。请参阅数据库探查器输出以获取探查器创建的system.profile文件的概述。

探查器默认情况下处于关闭状态。您可以在每个数据库或每个实例上启用多个级别的探查器。

启用后,性能分析会影响数据库性能和磁盘使用情况。有关更多信息,请参见数据库探查器的开销。

本文档概述了数据库分析器的许多关键管理选项。有关其他相关信息,请考虑以下资源:

数据库探查器输出 探查器命令 db.currentOp()

分析级别

提供以下分析级别:

水平 描述
0 探查器已关闭,并且不收集任何数据。这是默认的探查器级别。
1 探查器收集花费的时间长于slowms值的数据。
2 探查器收集所有操作的数据。

启用和配置数据库分析

您可以为mongod实例启用数据库分析。

本节使用mongoShell的db.setProfilingLevel()帮助程序来启用分析。

为mongod实例启用分析时,请将分析级别设置为大于0的值。事件探查器将数据记录在system.profile集合中。对数据库启用探查后,MongoDB会在数据库中创建system.profile集合。

要启用探查并设置探查级别,请将探查级别传递给db.setProfilingLevel()。例如,要对所有数据库操作启用探查,请在mongoshell中考虑以下操作:

1
db.setProfilingLevel(2)

shell返回一个文档,该文档显示以前的探查级别。该文档显示以前的探查级别。 “ok”:1个键值对表示操作成功:

1
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }

要验证新设置,请参阅检查配置文件级别部分。

指定慢速操作的阈值

默认情况下,慢速操作阈值为100毫秒。要更改慢速操作阈值,请通过以下方式之一指定所需的阈值:

  • 使用profile命令或db.setProfilingLevel()方法来设置slowms的值。
  • 在启动时从命令行设置–slowms的值。
  • 在配置文件中设置slowOpThresholdMs的值。

例如,以下代码将当前mongod实例的性能分析级别设置为1,并将实例的慢速操作阈值设置为mongod20毫秒:

1
db.setProfilingLevel(1, { slowms: 20 })

探查级别为1,将探查慢于阈值的操作

重要

慢速操作阈值适用于mongod实例中的所有数据库。数据库分析器和诊断日志都使用它,并且应将其设置为最大有用值,以避免性能下降。

从MongoDB 4.0开始,您可以使用db.setProfilingLevel() 为mongos设置 slowms和sampleRatefor。对于mongos,slowms和sampleRate配置设置仅影响诊断日志,而不会影响事件探查器,因为在mongos上无法进行性能分析。

例如,以下设置mongos实例的慢速操作阈值以记录慢速操作:

1
db.setProfilingLevel(0, { slowms: 20 })

从MongoDB 4.2开始,用于读取/写入操作的事件探查器条目和诊断日志消息(即mongod / mongos日志消息)包括:

  • queryHash帮助识别具有相同查询形状的慢速查询 。
  • planCacheKey为深入了解查询计划缓存提供慢速查询。

从版本4.2(也从版本4.0.6开始可用)开始,副本集的辅助成员现在 记录的oplog条目所花费的时间比慢操作阈值要长。这些缓慢的oplog消息在REPL组件下的诊断日志中记录了辅助日志,并使用op施加了文本:<oplog entry>took<num> ms。这些慢操作日志条目仅取决于慢操作阈值。它们不依赖于日志级别(在系统级别或组件级别),配置级别或运行缓慢的采样率。探查器不会捕获缓慢的操作日志条目。

分析慢速操作的随机样本

3.6版的新功能。

要仅分析所有慢速操作的随机采样子集,请通过以下方式之一指定所需的采样率:

  • 使用profile命令或db.setProfilingLevel()方法设置sampleRate值。
  • 在启动时,从命令行中为mongod设置–slowOpSampleRate或为mongos设置–slowOpSampleRate的值。
  • 在配置文件中设置slowOpSampleRate的值。

默认情况下,sampleRate设置为1.0,这意味着将对所有慢速操作进行分析。当sampleRate设置为0和1之间时,配置文件级别为1的数据库将仅根据sampleRate探查慢速操作的随机采样百分比。

例如,以下方法将mongod的分析级别设置为1,并将探查器设置为对所有慢速操作的42%进行采样:

1
db.setProfilingLevel(1, { sampleRate: 0.42 })

修改后的采样率值也适用于系统日志。

从MongoDB 4.0开始,您可以使用db.setProfilingLevel() 为mongos设置 slowms和sampleRatefor。对于mongos,slowms和sampleRate配置设置仅影响诊断日志,而不会影响事件探查器,因为在mongos上无法进行性能分析.

例如,以下内容mongos为记录慢速操作设置实例的采样率:

1
db.setProfilingLevel(0, { sampleRate: 0.42 })

重要

当logLevel设置为0时,MongoDB将以slowOpSampleRate确定的速率将慢速操作记录到诊断日志中。从MongoDB 4.2开始,副本集的辅助副本将记录所有花费比慢操作阈值更长的时间来应用的oplog条目消息,而不管采样率如何。

在较高的logLevel设置下,所有操作都将显示在诊断日志中,而与它们的延迟无关,但以下情况除外:辅助节点记录慢速操作日志条目消息。辅助节点仅记录慢速操作日志条目;增加logLevel不会记录所有操作日志条目。

检查分析级别

要查看探查级别,请从mongoshell 发出以下命令:

1
db.getProfilingStatus()

shell返回类似于以下内容的文档:

1
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
  • was字段指示当前配置文件级别。
  • slowms字段指示操作时间阈值(以毫秒为单位),超过该阈值则认为操作缓慢。
  • sampleRate字段指示应分析的慢速操作的百分比。

要仅返回探查级别,请在mongoshell中使用db.getProfilingLevel(),如下所示:

1
db.getProfilingLevel()

禁用分析

要禁用分析,请在mongoshell中使用以下方法:

1
db.setProfilingLevel(0)

为整个mongod实例启用分析

为了在测试环境中进行开发,可以为整个mongod实例启用数据库分析。分析级别适用于mongod实例提供的所有数据库 。

要为mongod实例启用性能分析,请在启动时将以下选项传递给mongod。

1
mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5

或者,您可以在配置文件中指定operationProfiling。

它将分析级别设置为1,将慢速操作定义为持续时间超过15毫秒的操作,并指定仅应分析50%的慢速操作。

当logLevel设置为0时,slowms和slowOpSampleRate也影响将哪些操作记录到诊断日志中。slowms和slowOpSampleRate也可用于为mongos配置诊断日志记录。

数据库分析和分片

您无法在mongos实例上启用分析。要在分片群集中启用探查,必须为mongod群集中的每个实例启用探查 。

然而,在MongoDB中4.0开始,您可以设置–slowms和slowOpSampleRate上mongos配置诊断日志缓慢的操作。

查看Profiler数据

数据库探查器记录有关system.profile集合中数据库操作的信息 。

要查看概要分析信息,请查询system.profile集合。要查看示例查询,请参阅示例Profiler数据查询。有关输出数据的说明,请参见数据库探查器输出。

您可以$comment用来将数据添加到查询谓词,以更轻松地分析探查器中的数据。

探查器数据查询示例

本节显示对system.profile 集合的查询示例。有关查询输出的说明,请参见 Database Profiler Output。

要返回system.profile 集合中最新的10条日志条目,请运行类似于以下内容的查询:

1
db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()

要返回除命令操作($ cmd)之外的所有其他操作,请运行类似于以下内容的查询:

1
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()

要返回特定集合的操作,请运行类似于以下内容的查询。此示例返回mydb数据库 test集合中的操作:

1
db.system.profile.find( { ns : 'mydb.test' } ).pretty()

要返回比5毫秒慢的操作,请运行类似于以下内容的查询:

1
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()

要返回特定时间范围内的信息,请运行类似于以下内容的查询:

1
2
3
4
5
6
db.system.profile.find({
  ts : {
    $gt: new ISODate("2012-12-09T03:00:00Z"),
    $lt: new ISODate("2012-12-09T03:40:00Z")
  }
}).pretty()

以下示例着眼于时间范围,从输出中取消用户字段以使其更易于阅读,并根据每个操作运行的时间对结果进行排序:

1
2
3
4
5
6
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 } )

显示最近五次活动

在已启用探查的数据库上,mongoshell中的show profile helper显示5个最近执行的操作,这些操作至少花费1毫秒来执行。从mongo shell发出show个人资料,如下所示:

1
show profile

探查器开销

启用分析后,分析会影响数据库性能,特别是在配置为2 的 分析级别或使用低阈值且分析级别为1的情况下。分析还会消耗磁盘空间,因为它既会记录到system.profile 集合,也会记录到磁盘MongoDB logfile。在生产部署上配置和启用探查器之前,请仔细考虑所有性能和安全隐患。

system.profile集合

该system.profile集合是一个有 上限的集合,默认大小为1 MB。这种大小的集合通常可以存储数千个概要文件,但是某些应用程序每次操作可能会使用或多或少的配置文件数据。如果您需要更改system.profile集合的大小 ,请按照以下步骤操作。

system.profile在主数据库上更改集合大小

要更改主数据库system.profile上集合的大小,您必须:

  1. 禁用分析。
  2. 删除system.profile 集合。
  3. 创建一个新system.profile 集合。
  4. 重新启用分析。

例如,要创建字节(4 MB)的新system.profile集合,请4000000在mongoshell中使用以下操作序列 :

1
2
3
4
5
6
7
db.setProfilingLevel(0)

db.system.profile.drop()

db.createCollection( "system.profile", { capped: true, size:4000000 } )

db.setProfilingLevel(1)

system.profile在辅助上更改集合大小

要更改辅助节点上的system.profile集合的大小,必须停止辅助节点,使其独立运行,然后执行上述步骤。完成后,以副本集的成员身份重新启动独立服务器。有关详细信息,请参阅对副本集成员执行维护。