数据库分析器
数据库分析器收集有关对运行的 mongod
实例执行的 数据库命令 的详细信息。这包括CRUD操作以及配置和管理命令。 分析器将其收集的所有数据写入system.profile
集合,这是每个分析数据库中的固定固定大小集合。 有关分析器创建的 文档的概述,请参阅system.profile
数据库分析器输出 。
默认情况下,分析器为 off
状态。您可以按数据库或按实例启用分析器,并从多种级别中选取一个您需要的分析级别。
启用分析功能后,会影响数据库性能和磁盘使用情况。有关更多信息,请参见数据库分析器开销。
本文档概述了数据库分析器的一些关键管理选项。更多相关信息,请参阅:
警告
请勿尝试创建名称为system.profile
的时间序列集合或视图,否则 MongoDB Server 会崩溃。
分析级别
可用的分析级别如下:
0
- 分析器已关闭,因此不收集任何数据。这是默认的分析器级别。
1
分析器会收集超过
slowms
阈值或与指定过滤匹配的操作的数据。设置筛选器后:
slowms
和sampleRate
选项不用于分析。分析器仅捕获与筛选器匹配的操作。
2
- 该分析器会收集所有操作的数据。
启用和配置数据库性能分析
您可以为 mongod
实例启用数据库分析。
本节介绍如何使用 mongosh
辅助方法 db.setProfilingLevel()
来启用性能分析。要改用驱动程序方法,请参阅驱动程序文档。
当您为mongod
实例启用分析时,您可以设立分析级别设置为大于0的值。 分析器会将数据记录在system.profile
集合中。 为数据库启用分析后, MongoDB会在该数据库中创建system.profile
集合。
要启用分析并设立分析级别,请将分析级别传递给db.setProfilingLevel()
助手。 示例,要启用所有数据库操作的分析,请考虑mongosh
中的以下操作:
db.setProfilingLevel(2)
Shell 返回一个文档,显示上一个分析级别。"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 毫秒。要更改慢操作阈值,请通过以下方式之一指定所需的阈值:
使用
profile
命令或db.setProfilingLevel()
Shell 助手方法来设置slowms
的值。启动时通过命令行设置
--slowms
参数的值。在配置文件中设置
slowOpThresholdMs
的值。
例如,以下代码将当前 mongod
实例的分析级别设为 1
,并将 mongod
实例的慢速运行阈值设为 20 毫秒:
db.setProfilingLevel(1, { slowms: 20 })
1
的分析级别将分析比阈值慢的操作。
重要
慢速运行阈值适用于 mongod
实例中的所有数据库。它由数据库分析器和诊断日志使用,并且应设置为最高有用值以避免性能下降。
从 MongoDB 4.0 开始,您可以使用 db.setProfilingLevel()
来为 mongos
配置 slowms
和 sampleRate
。对于 mongos
,slowms
和 sampleRate
配置设置仅影响诊断日志而不影响分析器,因为在 mongos
上无法使用分析。[1]
例如,以下设置了 mongos
实例的慢操作阈值,用于记录慢操作:
db.setProfilingLevel(0, { slowms: 20 })
用于读写操作的分析器条目和诊断日志消息(即 mongod/mongos 日志消息)包括:
现在,副本集的从节点会记录应用时间超过慢操作阈值的 oplog 条目。这些慢 oplog 消息:
在
diagnostic log
中针对从节点记录。记录在
REPL
组件下,该组件将含有文本applied op: <oplog entry> took <num>ms
。不依赖日志级别(系统级别或组件级别)
不依赖于分析级别。
受
slowOpSampleRate
影响。
分析器不会捕获慢 oplog 条目。
分析慢操作的随机样本
版本 3.6 中的新增功能。
要仅对所有慢操作中一个随机采样的子集进行分析,请按照以下方式指定所需采样率:[2]
使用
profile
命令或db.setProfilingLevel()
Shell 助手方法来设置sampleRate
的值。在启动时通过命令行,为
mongod
设置--slowOpSampleRate
的值,为mongos
设置--slowOpSampleRate
的值。在配置文件中设置
slowOpSampleRate
的值。
默认情况下,sampleRate
设立为1.0
,即对所有慢速操作进行分析。当sampleRate
设立为 0 到 1 之间时,分析级别为1
的数据库将仅根据sampleRate
分析随机样本百分比的慢速操作。
例如,以下方法将 mongod
的分析级别设置为 1
,并将分析器设置为对所有慢操作进行 42% 的采样:
db.setProfilingLevel(1, { sampleRate: 0.42 })
修改后的样本率值也适用于系统日志。
从 MongoDB 4.0 开始,您可以使用 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()
Shell 助手方法来设置filter
的值。
对于 mongod
实例,该 filter
既影响诊断日志,也会影响剖析器(如果启用)。
对于 mongos
实例,filter
仅影响诊断日志而不影响分析器,因为 mongos
无法使用分析。
注意
设置分析 filter
时,lowms 和 sampleRate 选项不会影响诊断日志或分析器。
例如,以下 db.setProfilingLevel()
方法为 mongod
实例进行设置:
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
。
mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5
或者,您可以在配置文件中指定 operationProfiling。
这会将分析级别设为 1
,将慢速操作定义为持续时间超过 15
毫秒的操作,并指定仅应分析 50% 的慢速操作。[2]
slowms
和 slowOpSampleRate
还会影响当 logLevel
设为 0
时会将哪些操作记录到诊断日志中。slowms
和 slowOpSampleRate
还可用于配置 mongos
的诊断日志。[2]
数据库分析与分片
无法在 mongos
实例上启用分析。要在分片集群中启用分析,必须为集群中的每个 mongod
实例启用分析。
但是,您可以在 mongos
上设置 --slowms
和 slowOpSampleRate
,以便为慢操作配置诊断日志。
查看分析器数据
数据库分析器在 system.profile
集合中记录有关数据库操作的信息。
要查看分析信息,请查询 system.profile
集合。要查看示例查询,请参阅分析器数据查询示例。有关输出数据的说明,请参阅数据库分析器输出。
现在已无法在事务中对 system.profile
集合执行任何操作,包括读取操作。
提示
您可以使用 $comment
将数据添加到查询谓词中,以便更轻松地分析来自分析器的数据。
分析器数据查询示例
本部分将展示对 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
集合
system.profile
集合是一个固定大小集合,默认大小为 1 MB。这种大小的集合通常可以存储数千个分析文档,但某些应用程序每次操作可能会使用或多或少的分析数据。如果需要更改 system.profile
集合的大小,请按照以下步骤操作。
更改主节点上的 system.profile
集合的大小
要更改主节点上的 system.profile
集合的大小,您必须:
禁用分析。
删除
system.profile
集合。创建一个新的
system.profile
集合。重新启用分析。
例如,要创建一个新的 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
集合的大小
要更改从节点 system.profile
集合的大小,必须停止从节点,让其独立运行,然后执行上述步骤。完成后,作为副本集的节点重新独立运行。有关更多信息,请参阅对自管理副本集节点执行维护。
[2] | (1、2、3) 副本集的从节点现在会记录应用时间超过慢操作阈值的 oplog 条目。这些慢 oplog 消息:
|