Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

数据库分析器

在此页面上

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

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

分析器将其收集的所有数据写入每个被分析数据库中的 system.profile 集合,这是一种固定大小集合。请参阅数据库分析器输出,以了解针对分析器所创建的 system.profile 文档的概述。

默认情况下,分析器为 off 状态。您可以按数据库或按实例启用分析器,并从多种级别中选取一个您需要的分析级别。

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

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

警告

不要尝试创建名称为 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() 封装方法对数据库分析器 levelslowmssampleRatefilter 所做的更改会记录在 log file 中。

slowmssampleRate 分析设置为全局设置,设置后会影响进程中的所有数据库。

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

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

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

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

分析级别为 1 会导致分析器记录慢于 slowms 阈值的擦作。

重要

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

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

以下示例设置 mongos 实例的慢操作阈值,用于将慢操作记录到 20

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

用于读写操作的分析器条目诊断日志消息(即 mongod/mongos 日志消息)包括:

现在,副本集的从节点会记录应用时间超过慢操作阈值的 oplog 条目。这些慢 oplog 消息:

  • diagnostic log中针对从节点记录。

  • 记录在 REPL 组件下,该组件将含有文本 applied op: <oplog entry> took <num>ms

  • 不依赖日志级别(系统级别或组件级别)

  • 不依赖于分析级别。

  • slowOpSampleRate 影响。

分析器不会捕获慢 oplog 条目。

要仅对所有操作中一个随机采样的子集进行分析,请按照以下方式指定所需采样率:[2]

默认情况下,sampleRate 设置为 1.0,即对所有操作进行分析。当 sampleRate 设置在 01 之间时,分析级别为 1 的数据库仅分析基于 sampleRate 随机采样的一部分操作。

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

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

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

您可以使用 db.setProfilingLevel() 来为 mongos 配置 slowmssampleRate。对于 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 时,lowmssampleRate 选项不会影响诊断日志或分析器。

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

  • 分析级别设置为 2

  • { 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 实例启用分析。

但是,您可以在 mongos 上设置 --slowmsslowOpSampleRate,以便为慢操作配置诊断日志。

数据库分析器在 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 辅助命令会显示最近 5 个执行耗时至少为 1 毫秒的操作。从 mongosh 运行 show profile

show profile

启用后,分析会影响数据库性能,尤其是将分析级别配置为 2,或者使用较低阈值且分析级别为 1 时。

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

警告

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

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

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

  1. 禁用分析。

  2. 删除 system.profile 集合。

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

  4. 重新启用分析。

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

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

要更改从节点 system.profile 集合的大小,必须停止从节点,让其独立运行,然后执行上述步骤。完成后,作为副本集的节点重新独立运行。有关更多信息,请参阅对自管理副本集节点执行维护

[2](123) 副本集的从节点现在会记录应用时间超过慢操作阈值的 oplog 条目。这些慢 oplog 消息:
  • diagnostic log中针对从节点记录。
  • 记录在 REPL 组件下,该组件将含有文本 applied op: <oplog entry> took <num>ms
  • 不依赖日志级别(系统级别或组件级别)
  • 不依赖于分析级别。
  • slowOpSampleRate 影响。
分析器不会捕获慢 oplog 条目。

后退

解释结果