Database Profiler

在本页面

数据库分析器收集有关正在运行的mongod实例执行的Database Commands的详细信息。这包括 CRUD 操作以及配置和 Management 命令。探查器将收集到的所有数据写入admin数据库中的capped collectionsystem.profile集合。有关分析器创建的system.profile文档的概述,请参见数据库探查器输出

探查器默认为off。您可以在每个profiling levels的数据库或实例上启用分析器。

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

Profiling Levels

提供以下分析级别:

LevelDescription
0探查器已关闭,并且不收集任何数据。这是默认的探查器级别。
1分析器收集的操作数据所花费的时间比slowms的时间长。
2探查器收集所有操作的数据。

启用和配置数据库分析

您可以使用mongo shell 或使用profile命令通过驱动程序来启用数据库分析。本节将说明如何通过mongo shell 执行此操作。如果要从应用程序内部控制探查器,请参见driver documentation

启用性能分析时,还需要设置profiling level。探查器将数据记录在system.profile集合中。对数据库启用概要分析后,MongoDB 将在数据库中创建system.profile集合。

要启用概要分析并设置概要分析级别,请在mongo shell 中使用db.setProfilingLevel() helper,并将概要分析级别作为参数传递。例如,要对所有数据库操作启用概要分析,请在mongo shell 中考虑以下操作:

db.setProfilingLevel(2)

Shell 程序返回一个文档,该文档显示概要分析级别。 "ok" : 1键值对表示操作成功:

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

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

指定慢速操作的阈值

要更改慢速操作阈值,请通过以下方式之一指定所需的阈值:

默认情况下,慢速操作阈值为 100 毫秒。分析级别为1的数据库将分析操作的速度低于阈值。

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

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

Important

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

对于从版本 3.6.11 开始的 MongoDB 3.6 部署,副本集的辅助成员现在为记录操作日志条目,所花费的时间超过了慢操作阈值。这些慢速 oplog 消息将在文本applied op: <oplog entry> took <num>ms下的REPL组件下的diagnostic log中记录。这些慢操作日志条目仅取决于慢操作阈值。它们不取决于日志级别(系统级别或组件级别),配置级别或运行缓慢的采样率。探查器不会捕获缓慢的操作日志条目。

随机抽取慢速操作 samples

3.6 版的新功能。

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

默认情况下,sampleRate设置为1.0,这意味着将对所有* slow 操作进行分析。当sampleRate设置为 0 到 1 之间时,配置文件级别为1的数据库将仅根据sampleRate随机抽取百分比的 slow *操作。

例如,以下方法将当前数据库的概要分析级别设置为1,并将探查器设置为对所有* slow *操作采样 42%:

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

Important

采样率值适用于mongod实例中的所有数据库。数据库分析器和系统日志都使用它。

Important

logLevel设置为0时,MongoDB 以slowOpSampleRate确定的速率将* slow *操作记录到诊断日志中。对于从版本 3.6.11 开始的 MongoDB 3.6 部署,副本集的第二副本将设置日志所有花费比慢操作阈值更长的时间的 oplog 条目消息,而与采样率无关。

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

检查配置文件级别

要查看profiling level,请从mongo shell 发出以下命令:

db.getProfilingStatus()

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

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

was字段指示当前配置文件级别。

slowms字段表示操作时间阈值(以毫秒为单位),超过该时间阈值将被视为* slow *。

sampleRate字段指示应配置的* slow *操作的百分比。

要仅返回概要分析级别,请使用mongo shell 中的db.getProfilingLevel()帮助器,如下所示:

db.getProfilingLevel()

Disable Profiling

要禁用分析,请在mongo shell 中使用以下帮助器:

db.setProfilingLevel(0)

为整个 mongod 实例启用分析

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

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

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

或者,您可以在configuration file中指定operationProfiling

这会将概要分析级别设置为1,将慢速操作定义为持续时间长于15毫秒的操作,并指定仅应配置* slow *操作的 50%。 [1]

logLevel设置为0时,slowmsslowOpSampleRate还影响将哪些操作记录到诊断日志中。

数据库分析和分片

不能mongos实例上启用分析。要在分片群集中启用性能分析,必须为群集中的每个mongod实例启用性能分析。

查看分析器数据

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

要查看分析信息,请查询system.profile集合。您可以使用$comment将数据添加到查询文档中,以便更轻松地分析探查器中的数据。要查看示例查询,请参见探查器数据查询示例

有关输出数据的说明,请参见数据库探查器输出

Profiler 数据查询示例

本节显示对system.profile集合的查询示例。有关查询输出的说明,请参见数据库探查器输出

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

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

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

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

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

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()

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

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帮助器将显示 5 个最近的操作,这些操作至少花费 1 毫秒来执行。从mongo shell 发出show profile,如下所示:

show profile

Profiler Overhead

启用后,性能分析对性能的影响较小。 system.profile集合是capped collection,默认大小为 1 MB。这种大小的集合通常可以存储数千个概要文件,但是某些应用程序每次操作可能会使用或多或少的配置文件数据。

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

要更改system.profile集合的大小,您必须:

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

db.setProfilingLevel(0)

db.system.profile.drop()

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

db.setProfilingLevel(1)

更改辅助节点上的 system.profile 集合的大小

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

[1]*(12)*对于从 3.6.11 版本开始的 MongoDB 3.6 部署,副本集的辅助成员现在记录操作日志条目所花费的时间超过了慢操作阈值。这些慢速 oplog 消息在REPL组件下的diagnostic log中以文本applied op: <oplog entry> took <num>ms记录在diagnostic log中。这些慢操作日志条目仅取决于慢操作阈值。它们不取决于日志级别(系统级别或组件级别),配置级别或运行缓慢的采样率。探查器不会捕获缓慢的操作日志条目。