数据库分析器
数据库分析器收集有关数据库命令针对运行中的mongod
实例执行。这包括CRUD操作以及配置和管理命令。
分析器将收集的所有数据写入到每个分析数据库中的system.profile
集合,这是一个固定集合。有关分析器创建的system.profile
文档的概述,请参阅数据库分析器输出。
分析器默认是关闭的。您可以在多个分析级别中启用数据库分析器,以每个数据库或每个实例为基准。分析级别.
启用后,分析对数据库性能和磁盘使用有影响。有关更多信息,请参阅数据库分析器开销。
本页展示了数据库分析器的重要管理选项。有关更多信息,请参阅
警告
不要尝试创建名为system.profile
的时间序列集合或视图。MongoDB 6.3及更高版本在尝试执行此操作时将返回一个IllegalOperation
错误。早期MongoDB版本会崩溃。
分析级别
以下分析级别可用
启用和配置数据库性能分析
您可以为 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()
包装方法对 数据库性能分析器 级别、slowms
、sampleRate
或 filter
进行更改的更改将记录在 日志文件
中。
全局和按数据库配置的配置设置
slowms 和 sampleRate 配置设置是 全局 的。设置后,这些设置会影响您进程中的所有数据库。
通过 profile
命令或 db.setProfilingLevel()
脚本辅助方法设置时,配置级别 和 过滤器 设置在 数据库 级别。当作为命令行或 配置文件 选项设置时,配置级别和 过滤器
设置会影响整个进程。
指定慢操作的阈值
默认情况下,慢操作阈值为 100 毫秒。
慢操作根据 workingMillis
记录,即 MongoDB 在该操作上花费的时间量。这意味着等待锁和流控制等因素不影响操作是否超过慢操作阈值。
要更改慢操作阈值,可以通过以下方式指定所需的阈值值
使用
profile
命令或db.setProfilingLevel()
脚本辅助方法设置slowms
的值。在启动时,从命令行设置
--slowms
的值。在
slowOpThresholdMs
中设置值,该值位于 配置文件 中。
以下示例将当前连接的数据库的配置级别设置为 1
,并将 mongod
实例的慢操作阈值设置为 20
毫秒。
db.setProfilingLevel( 1, { slowms: 20 } )
配置级别为 1
会使得分析器记录比 slowms
阈值慢的操作。
重要
慢操作阈值适用于 mongod
实例中的所有数据库。它被数据库分析器和诊断日志共同使用,应设置为最高可用的值,以避免性能下降。
您可以使用 db.setProfilingLevel()
来配置 mongos
的 slowms
和 sampleRate
。对于 mongos
,slowms
和 sampleRate
配置设置仅影响诊断日志,而不是分析器,因为 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]
使用
profile
命令或db.setProfilingLevel()
shell辅助方法来设置sampleRate
的值。在启动时,使用命令行设置
--slowOpSampleRate
的值,用于mongod
或用于--slowOpSampleRate
的mongos
。在配置文件中设置
slowOpSampleRate
的值。
默认情况下,sampleRate
设置为1.0
,表示分析所有慢速操作。当sampleRate
设置为介于0
和1
之间的值时,具有1
分析级别的数据库将根据sampleRate
随机采样一定比例的慢速操作。
以下示例将当前连接的数据库的性能分析级别设置为1
,并将分析器设置为采样所有慢速操作的42%。
db.setProfilingLevel( 1, { sampleRate: 0.42 } )
修改后的采样率值也适用于系统日志。
您可以使用db.setProfilingLevel()
来配置mongos
的slowms
和sampleRate
。对于mongos
,slowms
和sampleRate
配置设置仅影响诊断日志,而不影响分析器,因为在mongos
上不可用。[1]
例如,以下设置 mongos
实例的慢操作日志采样率
db.setProfilingLevel( 0, { sampleRate: 0.42 } )
重要
当 logLevel
设置为 0
时,MongoDB 以由 slowOpSampleRate
确定的速率将 慢操作 记录到诊断日志中。
在更高的 logLevel
设置中,所有操作都会出现在诊断日志中,除非以下例外:次级副本的慢操作 oplog 条目日志。次级副本只记录慢操作 oplog 条目;增加 logLevel
并不会记录所有 oplog 条目。
[1] | (1, 2) 参见 数据库分析器和分片。 |
设置过滤器以确定分析操作
您可以设置一个过滤器来控制哪些操作被分析并记录。您可以通过以下方式设置分析过滤器
使用
profile
命令或db.setProfilingLevel()
脚本辅助方法设置filter
的值。
对于 mongod
实例,filter
影响诊断日志和(如果启用)分析器。
对于 mongos
实例,filter
只影响诊断日志,不影响分析器,因为在 mongos
上不可用。
注意
当设置配置文件filter
时,slowms和sampleRate选项不会影响诊断日志或分析器。
以下db.setProfilingLevel()
示例设置了当前连接数据库的配置文件级别
db.setProfilingLevel( 2, { filter: { op: "query", millis: { $gt: 2000 } } } )
检查配置文件级别
db.getProfilingStatus()
shell返回的文档类似于以下内容
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
was
字段指示当前的配置文件级别。
slowms
字段指示操作时间阈值(毫秒),超过此阈值的操作被视为慢操作。
sampleRate
字段指示应进行配置文件分析的慢操作的百分比。
禁用配置文件
要禁用配置文件,请在mongosh
:
db.setProfilingLevel(0)
注意
禁用分析可以提高数据库性能并降低磁盘使用。有关更多信息,请参阅数据库分析开销。
为整个mongod
实例启用分析
在开发和测试环境中,您可以为整个mongod
实例启用数据库分析。分析级别适用于由mongod
实例提供的所有数据库。
要为mongod
实例启用分析,请在启动时向mongod
传递以下选项。
mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5
或者,您可以在配置文件中指定operationProfiling。
这设置分析级别为1
,将持续时间超过15
毫秒的操作定义为慢操作,并指定仅对50%的慢操作进行分析。[2]
slowms
和slowOpSampleRate
也会影响当logLevel
设置为0
时记录在诊断日志中的操作。同样,slowms
和slowOpSampleRate
也可用于配置mongos
的诊断日志。[2]
数据库性能分析和分片
您无法在 mongos
实例上启用性能分析。要在分片集群中启用性能分析,您必须在集群中的每个 mongod
实例上启用性能分析。
然而,您可以在 --slowms
和 slowOpSampleRate
上设置 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
集合
system.profile
集合是一个默认大小为 1 兆字节的 固定大小集合。这个大小的集合通常可以存储数千个分析文档,但某些应用程序可能每个操作使用更多或更少的分析数据。如果您需要更改 system.profile
集合的大小,请按照以下步骤操作。
更改主数据库中 system.profile
集合的大小
要更改主数据库中 system.profile
集合的大小,您必须
禁用分析。
删除
system.profile
集合。创建一个新的
system.profile
集合。重新启用分析。
例如,要创建一个大小为 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
集合的大小
要更改次级数据库中 system.profile
集合的大小,您必须停止次级数据库,将其作为独立实例运行,然后执行上述步骤。完成后,将独立实例作为副本集成员重新启动。有关更多信息,请参阅 在自管理副本集成员上执行维护。
[2] | (1, 2, 3) 副本集的次要成员现在会 记录应用操作所需时间超过慢操作阈值的 oplog 条目。这些慢 oplog 消息
|