数据库分析器输出
数据库分析器捕获有关读取和写入操作、游标操作和数据库命令的数据信息。要配置数据库分析器并设置捕获配置文件数据的阈值,请参阅数据库分析器部分。
数据库分析器将数据写入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.keysExaminedMongoDB执行操作时扫描的索引键的数量。
一般来说,如果
keysExamined远高于nreturned,则数据库正在扫描许多索引键以找到结果文档。考虑创建或调整索引以提高查询性能。keysExamined可用于以下命令和操作
system.profile.hasSortStagehasSortStage是一个布尔值,当查询 无法 使用索引中的排序来返回所需的排序结果时为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.lockssystem.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.storagesystem.profile.storage信息提供了操作存储引擎数据和等待时间。只有当值大于零时,才返回特定存储指标。
system.profile.storage.data.bytesRead操作从磁盘读取到缓存的字节数。
从磁盘读取到缓存的数据包括执行查询所需的所有内容。如果数据已在缓存中,则从磁盘读取的字节数可能为
0。从磁盘读取的字节数不仅包括查询到的文档
WiredTiger按页读取,一页可能包含一个或多个文档。如果一个文档在页中,该页中的所有文档都会被读入缓存并包含在
bytesRead值中。如果缓存需要页面管理(如淘汰或重新读取),则
bytesRead值将包括在这些操作中从磁盘读取的数据。如果索引不在缓存中或缓存中的索引已过时,WiredTiger将从磁盘读取多个内部和叶子页来在缓存中重建索引。
system.profile.responseLength操作结果文档的长度(字节)。较大的
responseLength可能会影响性能。要限制查询操作结果文档的大小,可以使用以下任何一种方法注意
当 MongoDB 将查询配置文件信息写入日志时,
responseLength的值位于名为reslen的字段中。
system.profile.protocolMongoDB 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" }