对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

数据库分析器

警告

数据库分析器可能会降低MongoDB性能。在启用数据库分析器之前,请考虑使用以下替代方案之一:

要学习;了解有关数据库分析器性能影响的更多信息,请参阅分析器开销。

数据库分析器负责收集数据库命令的详细信息。对正在运行中的 mongod 实例执行的数据库命令的相关信息都在其收集范围内。这包括 CRUD 操作以及配置和管理命令。

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

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

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

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

可用的分析级别如下:

0

分析器已关闭,因此不收集任何数据。这是默认的分析器级别。

1

分析器会收集用时超过 slowms 值或与某一筛选器匹配的操作的对应数据。

设置筛选器后:

  • slowms 和 sampleRate 选项不用于分析。

  • 分析器仅捕获与筛选器匹配的操作。

2

分析器会收集所有操作的数据。当设立为 2 级时,分析器会忽略用户提供的 slowms 和 filter 值。

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

要启用分析,请使用以下方法之一:

分析器会将数据记录在 system.profile 集合中。在为数据库启用分析后,MongoDB 会在该数据库中创建 system.profile 集合。

要在启动时为 mongod 实例启用剖析功能,请将 operationProfiling.mode 中的配置文件设置为首选日志级别。

要启用分析并设置分析级别,请将分析级别传递给 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() 封装方法对数据库分析器 level、 slowms、 sampleRate 或 filter 所做的更改会记录在 log file 中。

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

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

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

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

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

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

重要

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

You can use db.setProfilingLevel() to configure slowms and sampleRate for mongos. For the mongos, the slowms and sampleRate configuration settings only affect the diagnostic log and not the profiler since profiling is not available on 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 条目。

To profile only a randomly sampled subset of all slow operations, specify the desired sample rate in one of the following ways: [2]

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

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

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

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

You can use db.setProfilingLevel() to configure slowms and sampleRate for mongos. For the mongos, the slowms and sampleRate configuration settings only affect the diagnostic log and not the profiler because profiling isn't available on mongos. [1]

例如,以下设置了 mongos 实例用于记录慢速操作的采样率:

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

重要

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

在较高的 logLevel 设置下,所有操作都会出现在诊断日志中,无论其延迟如何,但从节点(secondary node from replica set)记录慢速 oplog 条目消息的操作除外。从节点(secondary node from replica set)仅日志慢速 oplog 条目;增加 logLevel 不会日志所有 oplog 条目。

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

您可以设置筛选器,控制要分析和记录的操作。您可以通过以下一种方式设置分析筛选器:

对于 mongod 实例,该 filter 既影响诊断日志,也会影响剖析器(如果启用)。

对于 mongos 实例,filter 仅影响诊断日志而不影响分析器,因为 mongos 无法使用分析。

注意

设置分析 filter 时,lowms 和 sampleRate 选项不会影响诊断日志或分析器。

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

  • 将分析级别设置为 1,

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

db.setProfilingLevel( 1, { 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。

This sets the profiling level to 1, defines slow operations as those that last longer than 15 milliseconds, and specifies that only 50% of slow operations should be profiled. [2]

The slowms and slowOpSampleRate also affect the operations that are recorded in the diagnostic log when logLevel is set to 0. The slowms and slowOpSampleRate are also available to configure diagnostic logging for mongos. [2]

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

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

数据库分析器在 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](1, 2, 3)

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

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

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

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

  • 不依赖于分析级别。

  • 受 slowOpSampleRate 影响。

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