数据库分析器输出
数据库分析器捕获有关读取和写入操作、游标操作和数据库命令的数据信息。要配置数据库分析器并设置捕获配置文件数据的阈值,请参阅数据库分析器部分。
数据库分析器将数据写入system.profile
集合,这是一个受限集合。要查看分析器的输出,请在system.profile
集合上使用正常的MongoDB查询。
注意
由于数据库分析器将数据写入数据库中的system.profile
集合,因此即使对于其他情况下只读的数据库,分析器也会对某些写入活动进行分析。
currentOp
和数据库分析器报告了CRUD操作相同的诊断信息,包括以下内容
这些操作也包含在慢查询日志中。有关慢查询日志的更多信息,请参阅slowOpThresholdMs
。
当使用可查询加密时,对加密集合的CRUD操作将从system.profile
集合中省略。有关详细信息,请参阅裁剪。
在事务内部,无法对system.profile
集合执行任何操作,包括读取。
警告
请勿尝试创建名为system.profile
的时间序列集合或视图。MongoDB 6.3及更高版本在尝试这样做时会返回一个IllegalOperation
错误。更早的MongoDB版本会崩溃。
输出字段
对于任何单个操作,数据库分析器创建的文档包含以下字段的子集。这些文档中字段的精确选择取决于操作类型。
注意
有关您MongoDB版本特定的输出,请参阅相应的MongoDB手册。
system.profile.command
包含与该操作相关联的完整命令对象的文档。
例如,以下输出包含在名为
items
的集合中,在名为test
的数据库上执行find
操作的命令对象。"command" : { "find" : "items", "filter" : { "sku" : 1403978 }, ... "$db" : "test" } 以下示例输出包含由具有游标ID
19234103609
的命令生成的,在名为items
的集合中,在名为test
的数据库上执行的getMore
操作的命令对象。"command" : { "getMore" : NumberLong("19234103609"), "collection" : "items", "batchSize" : 10, ... "$db" : "test" }, 如果命令文档超过50千字节,则文档具有以下形式
"command" : { "$truncated": <string>, "comment": <string> } $truncated
字段包含文档的字符串摘要(如果存在,则不包括文档的comment
字段)。如果摘要仍然超过50千字节,则进一步截断,字符串末尾用省略号 (...) 表示。如果将注释传递给操作,则存在
comment
字段。注释可以附加到任何 数据库命令。
system.profile.originatingCommand
对于从游标检索下一批结果的
"getmore"
操作,originatingCommand
字段包含最初创建该游标的完整命令对象(例如find
或aggregate
)。
system.profile.keysExamined
MongoDB执行操作时扫描的索引键的数量。
一般来说,如果
keysExamined
远高于nreturned
,则数据库正在扫描许多索引键以找到结果文档。考虑创建或调整索引以提高查询性能。keysExamined
可用于以下命令和操作
system.profile.hasSortStage
hasSortStage
是一个布尔值,当查询 无法 使用索引中的排序来返回所需的排序结果时为true
;即 MongoDB 必须在从游标接收文档后对文档进行排序。该字段仅在值为true
时出现。hasSortStage
适用于以下命令和操作getMore
(OP_GET_MORE和命令
)
system.profile.usedDisk
一个布尔值,表示由于 内存限制,任何聚合阶段是否已将数据写入临时文件。
仅在
usedDisk
为true
时出现。
system.profile.replanned
一个布尔值,表示查询系统是否移除了一个缓存计划并重新评估所有候选计划。
只有当值为
true
时才出现。
system.profile.replanReason
一个字符串,表示移除一个缓存计划的具体原因。
只有当
replanned
的值为true
时才出现。
system.profile.writeConflicts
在写操作期间遇到的冲突数量;例如,一个
update
操作尝试修改与另一个update
操作相同的文档。另见写冲突。
system.profile.numYield
操作需要让出以允许其他操作完成的次数。通常,当操作需要访问MongoDB尚未完全读入内存的数据时,它们会做出让步。这允许其他具有内存中数据的操作完成,同时MongoDB读取让步操作的数据。有关更多信息,请参阅操作何时让出的常见问题解答。
system.profile.queryHash
从 MongoDB 8.0 开始,现有的
queryHash
字段重命名为planCacheShapeHash
。如果您使用的是更早的 MongoDB 版本,您将看到queryHash
而不是planCacheShapeHash
。
system.profile.queryShapeHash
新在版本中8.0.
queryShapeHash
是一个十六进制字符串,代表查询形状的哈希值。详细信息请参阅 查询形状。
system.profile.planCacheShapeHash
这是一个表示计划缓存查询形状哈希值的十六进制字符串,并且仅依赖于计划缓存查询形状。
planCacheShapeHash
可帮助识别具有相同计划缓存查询形状的慢查询,包括写入操作的查询过滤器。注意
与任何哈希函数一样,不同的计划缓存查询形状可能导致相同的哈希值。然而,不同计划缓存查询形状之间哈希冲突的发生几率很小。
有关
planCacheShapeHash
和planCacheKey
的更多信息,请参阅 planCacheShapeHash 和 planCacheKey。从 MongoDB 8.0 开始,现有的
queryHash
字段重命名为planCacheShapeHash
。如果您使用的是更早的 MongoDB 版本,您将看到queryHash
而不是planCacheShapeHash
。
system.profile.planCacheKey
查询关联的计划缓存条目的键的哈希值。
与
planCacheShapeHash
不同,planCacheKey
是查询缓存形状和当前可用的索引的函数。具体来说,如果添加或删除可以支持查询形状的索引,则planCacheKey
的值可能会更改,但planCacheShapeHash
不会更改。有关
planCacheShapeHash
和planCacheKey
的更多信息,请参阅 planCacheShapeHash 和 planCacheKey。从 MongoDB 8.0 开始,现有的
queryHash
字段重命名为planCacheShapeHash
。如果您使用的是更早的 MongoDB 版本,您将看到queryHash
而不是planCacheShapeHash
。
system.profile.queryFramework
用于处理操作的 查询框架。
system.profile.locks
system.profile.locks
提供了在操作期间持有的各种 锁定类型和锁定模式 的信息。可能的锁定类型有
锁定类型描述ParallelBatchWriterMode
表示并行批量写入模式的锁定。
在早期版本中,PBWM 信息作为
Global
锁定信息的一部分进行报告。ReplicationStateTransition
表示复制集成员状态转换所采取的锁定。Global
表示全局锁定。Database
表示数据库锁定。Collection
表示集合锁定。Mutex
表示互斥锁。Metadata
表示元数据锁定。DDLDatabase
表示 DDL 数据库锁定。
新在版本中7.1.
DDLCollection
表示 DDL 集合锁定。
新在版本中7.1.
oplog
表示对 oplog 的锁定。锁定类型的可能锁定模式如下
锁定模式描述R
表示共享 (S) 锁。W
表示独占 (X) 锁。r
表示意向共享 (IS) 锁。w
表示意向独占 (IX) 锁。返回的各种锁定类型的锁定信息包括
system.profile.locks.acquireWaitCount
由于锁处于冲突模式而被阻塞的获取锁操作次数。
acquireWaitCount
小于或等于acquireCount
。
system.profile.locks.timeAcquiringMicros
操作获取锁所需的总时间(微秒)。
timeAcquiringMicros
除以acquireWaitCount
可得到特定锁模式的平均等待时间的大致估计。
有关锁定模式的更多信息,请参阅MongoDB使用的锁定类型是什么?
system.profile.authorization
新在版本中5.0.0.
每次操作访问用户缓存的次数。这些指标仅在操作至少访问一次用户缓存时显示。
这些指标仅在启用慢操作日志记录或数据库分析时可用。
system.profile.storage
system.profile.storage
信息提供了操作存储引擎数据和等待时间。只有当值大于零时,才返回特定存储指标。
system.profile.storage.data.bytesRead
操作从磁盘读取到缓存的字节数。
从磁盘读取到缓存的数据包括执行查询所需的所有内容。如果数据已在缓存中,则从磁盘读取的字节数可能为
0
。从磁盘读取的字节数不仅包括查询到的文档
WiredTiger按页读取,一页可能包含一个或多个文档。如果一个文档在页中,该页中的所有文档都会被读入缓存并包含在
bytesRead
值中。如果缓存需要页面管理(如淘汰或重新读取),则
bytesRead
值将包括在这些操作中从磁盘读取的数据。如果索引不在缓存中或缓存中的索引已过时,WiredTiger将从磁盘读取多个内部和叶子页来在缓存中重建索引。
system.profile.responseLength
操作结果文档的长度(字节)。较大的
responseLength
可能会影响性能。要限制查询操作结果文档的大小,可以使用以下任何一种方法注意
当 MongoDB 将查询配置文件信息写入日志时,
responseLength
的值位于名为reslen
的字段中。
system.profile.protocol
MongoDB Wire Protocol 请求消息格式。
system.profile.millis
从操作开始到操作结束,从
mongod
的角度看的时间(毫秒)。
system.profile.execStats
包含查询操作执行统计信息的文档。对于其他操作,该值是一个空文档。
system.profile.execStats
以树状结构呈现统计信息;每个节点提供查询操作在该阶段执行的操作的统计信息。注意
以下字段列表针对
execStats
并非详尽无遗,因为返回的字段随阶段而异。
system.profile.appName
运行操作的客户端应用程序标识符。使用
appName
连接字符串选项来设置appName
字段的自定义值。
system.profile.allUsers
会话中认证用户信息(用户名和数据库)的数组。另请参阅自托管部署中的用户。
示例 system.profile
文档
以下示例展示了在独立数据库上操作时,在 system.profile
集合中找到的样本文档。
在 system.profile
集合中的以下文档显示了在 test.report
集合上执行的样本查询操作的指标。
{ "op" : "query", "ns" : "test.report", "command" : { "find" : "report", "filter" : { "a" : { "$lte" : 500 } }, "lsid" : { "id" : UUID("5ccd5b81-b023-41f3-8959-bf99ed696ce9") }, "$db" : "test" }, "cursorid" : 33629063128, "keysExamined" : 101, "docsExamined" : 101, "fromMultiPlanner" : true, "numYield" : 2, "nreturned" : 101, "planCacheShapeHash" : "811451DD", "planCacheKey" : "759981BA", "queryFramework" : "classic", "locks" : { "Global" : { "acquireCount" : { "r" : NumberLong(3), "w" : NumberLong(3) } }, "Database" : { "acquireCount" : { "r" : NumberLong(3) }, "acquireWaitCount" : { "r" : NumberLong(1) }, "timeAcquiringMicros" : { "r" : NumberLong(69130694) } }, "Collection" : { "acquireCount" : { "r" : NumberLong(3) } } }, "storage" : { "data" : { "bytesRead" : NumberLong(14736), "timeReadingMicros" : NumberLong(17) } }, "responseLength" : 1305014, "protocol" : "op_msg", "millis" : 69132, "planningTimeMicros" : 129, "planSummary" : "IXSCAN { a: 1, _id: -1 }", "execStats" : { "stage" : "FETCH", "nReturned" : 101, "executionTimeMillisEstimate" : 0, "works" : 101, "advanced" : 101, "needTime" : 0, "needYield" : 0, "saveState" : 3, "restoreState" : 2, "isEOF" : 0, "docsExamined" : 101, "alreadyHasObj" : 0, "inputStage" : { ... } }, "ts" : ISODate("2019-01-14T16:57:33.450Z"), "client" : "127.0.0.1", "appName" : "MongoDB Shell", "allUsers" : [ { "user" : "someuser", "db" : "admin" } ], "user" : "someuser@admin" }
system.profile
集合包括 getMore
操作的指标。在此示例中,getMore
从 test.report
集合返回额外的文档。
{ "op" : "getmore", "ns" : "test.report", "command" : { "getMore" : Long("33629063128"), "collection" : "report", "batchSize": 3, "lsid" : { "id": new UUID("3148c569-425c-4498-9168-5b7ee260bf27") }, "$db" : "test" }, originatingCommand: { "find: "report", "filter" : { "a" : { "$lte" : 500 } }, "lsid" : { "id" : UUID("5ccd5b81-b023-41f3-8959-bf99ed696ce9") }, "$db" : "test" }, "cursorid" : Long("33629063128"), "keysExamined" : 101, "docsExamined" : 101, "fromMultiPlanner" : true, "numYield" : 2, "nreturned" : 3, "planCacheShapeHash" : "811451DD", "planCacheKey" : "759981BA", "queryFramework": "classic" "locks" : { "Global" : { "acquireCount" : { "r" : NumberLong(3), "w" : NumberLong(3) } }, "Database" : { "acquireCount" : { "r" : NumberLong(3) }, "acquireWaitCount" : { "r" : NumberLong(1) }, "timeAcquiringMicros" : { "r" : NumberLong(69130694) } }, "Collection" : { "acquireCount" : { "r" : NumberLong(3) } } }, readConcern: {level: 'local', provenance: 'implicitDefault'}, "responseLength" : 1305014, "protocol" : "op_msg", "millis" : 69132, "planSummary" : "IXSCAN { a: 1, _id: -1 }", "execStats" : { "stage" : "FETCH", "filter" : { "a" : { "$lte" : 500 } }, "nReturned" : 101, "executionTimeMillisEstimate" : 0, "works" : 104, "advanced" : 104, "needTime" : 0, "needYield" : 0, "saveState" : 3, "restoreState" : 2, "isEOF" : 0, "direction": 'forward', "docsExamined" : 104 }, "ts" : ISODate("2019-01-14T16:57:33.450Z"), "client" : "127.0.0.1", "appName" : "MongoDB Shell", "allUsers" : [ { "user" : "someuser", "db" : "admin" } ], "user" : "someuser@admin" }
从 MongoDB 8.0 开始,现有的 queryHash
字段重命名为 planCacheShapeHash
。如果您使用的是更早的 MongoDB 版本,您将看到 queryHash
而不是 planCacheShapeHash
。
update
(和delete
)操作的配置文件条目包含整个更新命令。
在 system.profile
集合中的以下文档显示了在 test.report
集合上执行的样本更新操作的指标。
{ "op" : "update", "ns" : "test.report", "command" : { "q" : { }, "u" : { "$rename" : { "a" : "b" } }, "multi" : true, "upsert" : false }, "keysExamined" : 0, "docsExamined" : 25000, "nMatched" : 25000, "nModified" : 25000, "keysInserted" : 25000, "keysDeleted" : 25000000, "numYield" : 6985, "locks" : { "Global" : { "acquireCount" : { "r" : NumberLong(6986), "w" : NumberLong(13972) } }, "Database" : { "acquireCount" : { "w" : NumberLong(6986) }, "acquireWaitCount" : { "w" : NumberLong(1) }, "timeAcquiringMicros" : { "w" : NumberLong(60899375) } }, "Collection" : { "acquireCount" : { "w" : NumberLong(6986) } }, "Mutex" : { "acquireCount" : { "r" : NumberLong(25000) } } }, "storage" : { "data" : { "bytesRead" : NumberLong(126344060), "bytesWritten" : NumberLong(281834762), "timeReadingMicros" : NumberLong(94549), "timeWritingMicros" : NumberLong(139361) } }, "millis" : 164687, "planningTimeMicros" : 129, "planSummary" : "COLLSCAN", "execStats" : { "stage" : "UPDATE", "nReturned" : 0, "executionTimeMillisEstimate" : 103771, "works" : 25003, "advanced" : 0, "needTime" : 25002, "needYield" : 0, "saveState" : 6985, "restoreState" : 6985, "isEOF" : 1, "nMatched" : 25000, "nWouldModify" : 25000, "wouldInsert" : false, "inputStage" : { "stage" : "COLLSCAN", "nReturned" : 25000, "executionTimeMillisEstimate" : 0, "works" : 25002, "advanced" : 25000, "needTime" : 1, "needYield" : 0, "saveState" : 31985, "restoreState" : 31985, "isEOF" : 1, "direction" : "forward", "docsExamined" : 25000 } }, "ts" : ISODate("2019-01-14T23:33:01.806Z"), "client" : "127.0.0.1", "appName" : "MongoDB Shell", "allUsers" : [ { "user" : "someuser", "db" : "admin" } ], "user" : "someuser@admin" }