Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs 菜单
Docs 主页
/ /

数据库分析器

警告

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

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

数据库分析器收集有关对运行的数据库命令mongod实例执行的详细信息,包括增删改查操作和管理命令。

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

默认下,分析器为 off。您可以在每个数据库或每个实例的多个分析级别之一启用它。启用后,分析会影响数据库性能和磁盘使用情况。请参阅数据库分析器开销。

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

可用的分析级别如下:

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

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

设置筛选器后:

  • slowmssampleRate 选项不用于分析。

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

2

该分析器会收集所有操作的数据。

当设立为 2 级时,分析器会忽略用户提供的 slowmsfilter 值。

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

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

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

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

要为当前连接的数据库上的所有操作启用分析,请在 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 是影响进程中所有数据库的全局设置。

Profiling level过滤器数据库级 设置,当使用 profiledb.setProfilingLevel() 设立时。当设立为命令行或配置文件选项时,它们会影响整个进程。

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

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

要更改慢操作阈值,请使用以下方法之一:

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

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

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

重要

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

对于mongos,使用db.setProfilingLevel()配置 slowmssampleRate。这些设置仅影响 mongos 上的诊断日志,而不影响分析器。分析在mongos上不可用。[1]

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

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

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

  • planCacheShapeHash 帮助识别具有相同计划缓存查询结构的慢查询。

    从MongoDB 8.0 开始,现有的 queryHash字段将复制到名为 planCacheShapeHash 的新字段中。 如果您使用的是早期MongoDB版本,则只能看到 queryHash字段。 未来的MongoDB版本将删除已弃用的 queryHash字段,您需要改用 planCacheShapeHash字段。

  • planCacheKey 更深入地了解慢查询的查询计划缓存

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

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

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

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

  • 不依赖于分析级别。

  • slowOpSampleRate 影响。

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

要仅分析慢速操作的随机采样子集,请通过以下方式之一设立sampleRate[2]

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

以下示例将分析级别设置为 1,并将分析设置为对 42% 的慢速操作进行示例:

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

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

对于mongosslowmssampleRate,仅影响诊断日志,不影响分析器。[1] 要设立mongos 日志记录的采样率:

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

重要

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

如果 logLevel 设置得较高,所有操作无论延迟如何,都会显示在诊断日志中,但从节点记录慢速 oplog 条目消息这项操作除外。从节点仅记录慢速 oplog 条目。增加 logLevel 不会导致记录所有 oplog 条目。

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

要控制分析和记录哪些操作,请通过以下方式之一设立过滤器:

对于 mongodfilter 同时影响诊断日志和分析器(如果已启用)。对于mongosfilter 仅影响诊断日志。

注意

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

以下示例使用仅记录耗时超过 2 秒的 query 操作的过滤设置分析级别 1

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

要查看分析级别,请在mongosh:中运行:

db.getProfilingStatus()

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

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

返回的文档包含:

  • was:当前分析级别。

  • slowms: operation time 阈值(以毫秒为单位)。

  • sampleRate:正在分析的慢速操作的百分比。

要禁用分析,请在 mongosh: 中运行:

db.setProfilingLevel(0)

注意

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

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

在初创企业时将以下选项传递给 mongod

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

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

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

slowmsslowOpSampleRate 还会影响当logLevel0 时诊断日志中记录的操作。这两个设置还为 mongos 配置诊断日志记录。[2]

提示

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

您可以在 上设立 和--slowms slowOpSampleRatemongos,以配置慢速操作的诊断日志。

分析器会将数据库操作记录到 system.profile 集合中。查询该集合以查看分析数据。有关示例查询,请参阅分析器数据查询示例。有关输出的详细信息,请参阅数据库分析器输出。

您不能在 ACIDsystem.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 时使用较低的 slowms 阈值时。分析也会使用磁盘空间,因为它会写入system.profile集合和MongoDBlogfile

警告

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

system.profile 集合是一个 固定大小集合,默认大小为 1 MB,通常可以存储数千个配置文件文档。如果需要更改大小,请按照以下步骤操作。

要更改 system.profile 集合在 主节点 (primary node in the replica set) 上的大小,请执行以下操作:

  1. 禁用分析。

  2. 删除 system.profile 集合。

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

  4. 重新启用分析。

mongosh示例,要在: system.profile中创建4000000 字节 (4 MB) 的新集合:

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

要更改从从节点(secondary node from replica set)上system.profile集合的大小,请停止从从节点(secondary node from replica set),将其作为独立运行的实例运行,然后执行上述步骤。然后,将其作为副本集成员重新启动。有关更多信息,请参阅对自管理副本集成员执行维护。

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

后退

解释慢速查询

在此页面上