数据库分析器
数据库分析器收集有关数据库命令针对运行中的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 消息
|