文档菜单
文档首页
/
MongoDB 手册
/ / / /

数据库分析器

本页内容

  • 分析级别
  • 启用和配置数据库分析器
  • 查看分析器数据
  • 分析器开销

数据库分析器收集有关数据库命令针对运行中的mongod实例执行。这包括CRUD操作以及配置和管理命令。

分析器将收集的所有数据写入到每个分析数据库中的system.profile集合,这是一个固定集合。有关分析器创建的system.profile文档的概述,请参阅数据库分析器输出

分析器默认是关闭的。您可以在多个分析级别中启用数据库分析器,以每个数据库或每个实例为基准。分析级别.

启用后,分析对数据库性能和磁盘使用有影响。有关更多信息,请参阅数据库分析器开销

本页展示了数据库分析器的重要管理选项。有关更多信息,请参阅

警告

不要尝试创建名为system.profile的时间序列集合或视图。MongoDB 6.3及更高版本在尝试执行此操作时将返回一个IllegalOperation错误。早期MongoDB版本会崩溃。

以下分析级别可用

0
分析器关闭,不收集任何数据。这是默认分析级别。
1

分析器收集超过slowms阈值的操作数据或匹配指定的过滤器

当设置过滤器时

  • 选项 slowmssampleRate 不用于性能分析。

  • 性能分析器仅捕获与过滤器匹配的操作。

2
性能分析器收集所有操作的数据。

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

本节说明如何使用 mongosh 辅助方法 db.setProfilingLevel() 来启用性能分析。要使用驱动程序方法,请参阅驱动程序文档

要为 mongod 实例启用性能分析,请将性能分析级别设置为大于 0 的值。性能分析器将数据记录在 system.profile 集合中。MongoDB 在您为数据库启用性能分析后,在该数据库中创建 system.profile 集合。

要启用性能分析和设置性能分析级别,请将性能分析级别传递给 db.setProfilingLevel() 辅助方法。例如,要为当前连接的数据库的所有数据库操作启用性能分析,请在 mongosh 中运行此操作:

db.setProfilingLevel(2)

shell 返回 was 字段中的 之前 性能分析级别并设置新级别。在以下输出中,键值对 "ok" : 1 指示操作成功

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

要验证新设置,请参阅检查性能分析级别部分。

从 MongoDB 5.0 开始,使用 profile 命令或 db.setProfilingLevel() 包装方法对 数据库性能分析器 级别、slowmssampleRatefilter 进行更改的更改将记录在 日志文件 中。

slowmssampleRate 配置设置是 全局 的。设置后,这些设置会影响您进程中的所有数据库。

通过 profile 命令或 db.setProfilingLevel() 脚本辅助方法设置时,配置级别过滤器 设置在 数据库 级别。当作为命令行或 配置文件 选项设置时,配置级别和 过滤器 设置会影响整个进程。

默认情况下,慢操作阈值为 100 毫秒。

慢操作根据 workingMillis 记录,即 MongoDB 在该操作上花费的时间量。这意味着等待锁和流控制等因素不影响操作是否超过慢操作阈值。

要更改慢操作阈值,可以通过以下方式指定所需的阈值值

以下示例将当前连接的数据库的配置级别设置为 1,并将 mongod 实例的慢操作阈值设置为 20 毫秒。

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

配置级别为 1 会使得分析器记录比 slowms 阈值慢的操作。

重要

慢操作阈值适用于 mongod 实例中的所有数据库。它被数据库分析器和诊断日志共同使用,应设置为最高可用的值,以避免性能下降。

您可以使用 db.setProfilingLevel() 来配置 mongosslowmssampleRate。对于 mongosslowmssampleRate 配置设置仅影响诊断日志,而不是分析器,因为 mongos 上不可用分析器。[1]

以下示例将 mongos 实例的慢操作阈值设置为记录慢操作为 20

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

以下 分析器条目 和读/写操作的 诊断日志消息(即 mongod/mongos 日志消息) 包含

  • planCacheShapeHash 以帮助识别具有相同 计划缓存查询形状 的慢查询。

    从 MongoDB 8.0 开始,现有的 queryHash 字段被重命名为 planCacheShapeHash。如果您正在使用更早的 MongoDB 版本,您将看到 queryHash 而不是 planCacheShapeHash

  • planCacheKey 以提供更多关于慢查询的 查询计划缓存 的见解。

副本集的次要成员现在会 记录应用操作所需时间超过慢操作阈值的 oplog 条目。这些慢 oplog 消息

  • 记录在次要成员的 诊断日志 中。

  • REPL 组件下记录,文本为 applied op: <oplog entry> took <num>ms

  • 不要依赖日志级别(无论是在系统级别还是组件级别)

  • 不要依赖分析器级别。

  • slowOpSampleRate 影响。

性能分析器无法捕获慢速操作日志条目。

要仅对所有慢速操作中的随机样本子集进行性能分析,可以通过以下方式指定所需的采样率:[2]

默认情况下,sampleRate设置为1.0,表示分析所有慢速操作。当sampleRate设置为介于01之间的值时,具有1分析级别的数据库将根据sampleRate随机采样一定比例的慢速操作。

以下示例将当前连接的数据库的性能分析级别设置为1,并将分析器设置为采样所有慢速操作的42%。

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

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

您可以使用db.setProfilingLevel()来配置mongosslowmssampleRate。对于mongosslowmssampleRate配置设置仅影响诊断日志,而不影响分析器,因为在mongos上不可用。[1]

例如,以下设置 mongos 实例的慢操作日志采样率

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

重要

logLevel 设置为 0 时,MongoDB 以由 slowOpSampleRate 确定的速率将 慢操作 记录到诊断日志中。

在更高的 logLevel 设置中,所有操作都会出现在诊断日志中,除非以下例外:次级副本的慢操作 oplog 条目日志。次级副本只记录慢操作 oplog 条目;增加 logLevel 并不会记录所有 oplog 条目。

[1](1, 2) 参见 数据库分析器和分片。

您可以设置一个过滤器来控制哪些操作被分析并记录。您可以通过以下方式设置分析过滤器

对于 mongod 实例,filter 影响诊断日志和(如果启用)分析器。

对于 mongos 实例,filter 只影响诊断日志,不影响分析器,因为在 mongos 上不可用。

注意

当设置配置文件filter时,slowmssampleRate选项不会影响诊断日志或分析器。

以下db.setProfilingLevel()示例设置了当前连接数据库的配置文件级别

  • 配置文件级别2

  • filter{ op: "query", millis: { $gt: 2000 } },这将导致分析器只记录耗时超过2秒的query操作。

db.setProfilingLevel( 2, { filter: { op: "query", millis: { $gt: 2000 } } } )

要查看配置文件级别,请在mongosh:

db.getProfilingStatus()

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

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

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

slowms字段指示操作时间阈值(毫秒),超过此阈值的操作被视为慢操作

sampleRate字段指示应进行配置文件分析的慢操作的百分比。

要禁用配置文件,请在mongosh:

db.setProfilingLevel(0)

注意

禁用分析可以提高数据库性能并降低磁盘使用。有关更多信息,请参阅数据库分析开销

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

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

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

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

这设置分析级别为1,将持续时间超过15毫秒的操作定义为慢操作,并指定仅对50%的操作进行分析。[2]

slowmsslowOpSampleRate也会影响当logLevel设置为0时记录在诊断日志中的操作。同样,slowmsslowOpSampleRate也可用于配置mongos的诊断日志。[2]

提示

另请参阅

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

然而,您可以在 --slowmsslowOpSampleRate 上设置 mongos 以配置慢操作的诊断日志。

数据库性能分析器日志记录了 system.profile 集合中的数据库操作信息。

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

现在无法在 system.profile 集合内部执行任何操作,包括读取,即使在事务中也是如此。

本节展示了在 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 } )

在已启用分析器的数据库中,mongosh 中的 show profile 辅助函数显示执行时间至少为1毫秒的5个最近操作。从 mongosh 运行 show profile

show profile

当启用时,分析器会对数据库性能产生影响,尤其是在配置了 分析器级别 为 2,或在使用 慢速阈值 为 1 的情况下。

分析器还会使用磁盘空间,因为分析器会将日志写入到 system.profile 集合和 MongoDB 的 logfile

警告

在将分析器启用到生产部署之前,请考虑性能和存储影响。

system.profile 集合是一个默认大小为 1 兆字节的 固定大小集合。这个大小的集合通常可以存储数千个分析文档,但某些应用程序可能每个操作使用更多或更少的分析数据。如果您需要更改 system.profile 集合的大小,请按照以下步骤操作。

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

  1. 禁用分析。

  2. 删除 system.profile 集合。

  3. 创建一个新的 system.profile 集合。

  4. 重新启用分析。

例如,要创建一个大小为 4000000 字节(4 MB)的新 system.profile 集合,请在 mongosh:

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

要更改次级数据库中 system.profile 集合的大小,您必须停止次级数据库,将其作为独立实例运行,然后执行上述步骤。完成后,将独立实例作为副本集成员重新启动。有关更多信息,请参阅 在自管理副本集成员上执行维护。

[2](1, 2, 3) 副本集的次要成员现在会 记录应用操作所需时间超过慢操作阈值的 oplog 条目。这些慢 oplog 消息
  • 记录在次要成员的 诊断日志 中。
  • REPL 组件下记录,文本为 applied op: <oplog entry> took <num>ms
  • 不要依赖日志级别(无论是在系统级别还是组件级别)
  • 不要依赖分析器级别。
  • slowOpSampleRate 影响。
性能分析器无法捕获慢速操作日志条目。

返回

解释结果