Docs 主页 → 开发应用程序 → MongoDB Manual
数据库分析器输出
数据库分析器捕获有关读写操作、游标操作和数据库命令的数据信息。要配置数据库配置文件并设置捕获配置文件数据的阈值,请参阅数据库分析器部分。
数据库分析器会在 system.profile
集合中写入数据,这是一个固定大小集合。要查看分析器的输出,请对 system.profile
集合使用一般 MongoDB 查询。
注意
由于数据库分析器会将数据写入数据库中的system.profile
collection,因此分析器将分析某些写入活动,即使对于只读的数据库也是如此。
currentOp
和数据库分析器会为所有 CRUD 操作报告相同的基本诊断信息,其中包括:
getMore
(OP_GET_MORE 和command
)
这些操作也包含在慢查询日志中(有关慢查询日志的更多信息,请参阅slowOpThresholdMs
)。
无法再在事务中对system.profile
集合执行任何操作,包括读取。
警告
请勿尝试创建名称为system.profile
的时间序列集合或视图,否则 MongoDB Server 会崩溃。
示例system.profile
文档
下面介绍了在system.profile
collection中找到的一些文档,这些文档用于独立运行的实例:
输出参考
对于任何单个操作,数据库分析器创建的文档都将包含以下字段的子集。这些文档中字段的精确选择取决于操作类型。
从 MongoDB 4开始。 2 (以及在4 . 0 . 9中),对于慢速操作,分析器条目和诊断日志消息包括 storage
信息。
注意
有关 MongoDB 版本的特定输出,请参阅相应版本的 MongoDB 手册。
system.profile.command
包含与此操作相关的完整命令对象的文档。
例如,以下输出包含在
test
数据库中items
集合上执行的find
操作的命令对象:"command" : { "find" : "items", "filter" : { "sku" : 1403978 }, ... "$db" : "test" } 以下示例输出包含
getMore
操作的命令对象,该命令对象由游标 ID 为19234103609
的命令在名为test
的数据库中名为items
的集合上生成:"command" : { "getMore" : NumberLong("19234103609"), "collection" : "items", "batchSize" : 10, ... "$db" : "test" }, 如果命令文档的大小超过 50 KB,则文档的格式如下:
"command" : { "$truncated": <string>, "comment": <string> } $truncated
字段包含文档的字符串概要,不包括文档的comment
字段(如果存在)。如果概要仍然超过 50 KB,则会进一步截断,在字符串末尾用省略号 (...) 表示。如果将注释传递给操作,则会出现
comment
字段。注释可以附加到任何数据库命令。
system.profile.originatingCommand
3.6 版本中的更改。
对于会从游标检索下一批结果的
"getmore"
操作,originatingCommand
字段包含最初创建该游标的完整命令对象(例如,find
或aggregate
)。
system.profile.keysExamined
在 3.2.0 版本中进行了更改。
由
system.profile.nscanned
重命名。 MongoDB 为执行操作而扫描的索引键数量。一般来说,如果
keysExamined
远高于nreturned
,则数据库正在扫描多个索引键以查找结果文档。考虑创建或调整索引以提高查询性能。已在 3.4 版本中更改。
keysExamined
可用于以下命令和操作:
system.profile.docsExamined
在 3.2.0 版本中进行了更改: 由
system.profile.nscannedObjects
重命名。MongoDB 为了执行该操作而扫描的集合中的文档数量。
已在 3.4 版本中更改。
docsExamined
可用于以下命令和操作:
system.profile.hasSortStage
在 3.2.0 版本中进行了更改: 由
system.profile.scanAndOrder
重命名。hasSortStage
是一个布尔值,当查询无法使用索引中的顺序返回请求的排序结果时,该值为true
;即,MongoDB 在从游标接收到文档后必须对文档进行排序。该字段仅在值为true
时出现。已在 3.4 版本中更改。
hasSortStage
可用于以下命令和操作:getMore
(OP_GET_MORE 和command
)
system.profile.usedDisk
4.2 版本中的新增功能。
一个布尔值,表示是否有任何聚合阶段由于内存限制而将数据写入临时文件。
仅在
usedDisk
为 true 时显示。
system.profile.replanned
一个布尔值,表示查询系统是否逐出了缓存的计划并重新评估了所有候选计划。
仅在值为
true
时显示。
system.profile.replanReason
一个字符串,表示缓存计划被逐出的具体原因。
仅在
replanned
的值为true
时显示。
system.profile.keysDeleted
已在 3.4 中删除。
更新在操作中更改的索引键的数量。 更改索引键的性能成本很小,因为数据库必须删除旧键并将新键插入 B-Tree 索引。
system.profile.writeConflicts
写入操作过程中遇到的冲突次数;例如,一个
update
操作尝试与另一个update
操作修改同一文档。另请参阅写冲突。
system.profile.numYield
该操作让出以允许其他操作完成的次数。通常,当操作需要访问 MongoDB 尚未完全读入内存的数据时,它们就会让出。这使得在 MongoDB 读取让出操作的数据时,其他已经在内存中有数据的操作可以完成。有关更多信息,请参阅有关操作让出时的常见问题解答。
system.profile.queryHash
一个十六进制字符串,表示查询结构的哈希值,并且仅依赖于查询结构。
queryHash
可以帮助识别具有相同查询结构的慢查询(包括写入操作的查询筛选器)。注意
与任何哈希函数一样,两个不同的查询结构可能会产生相同的哈希值。但是,不同查询结构之间不太可能发生哈希冲突。
有关
queryHash
和planCacheKey
的更多信息,请参阅queryHash
和planCacheKey
。4.2 版本中的新增功能。
system.profile.planCacheKey
与此查询关联的计划缓存条目的键的哈希值。
与
queryHash
不同,planCacheKey
是查询结构和该结构当前可用索引的函数。也就是说,如果添加/删除可以支持该查询结构的索引,则planCacheKey
值可能会更改,而queryHash
值不会更改。有关
queryHash
和planCacheKey
的更多信息,请参阅queryHash
和planCacheKey
。4.2 版本中的新增功能。
system.profile.queryFramework
用于处理操作的查询框架。
system.profile.locks
system.profile.locks
提供操作期间持有的各种锁类型和锁模式的信息。可能的锁类型包括:
锁类型的可能锁模式如下:
锁模式说明R
代表共享(S)锁。W
代表独占 (X) 锁。r
代表意向共享(IS)锁。w
代表意图独占 (IX) 锁。针对各种锁类型返回的锁信息包括:
system.profile.locks.acquireWaitCount
由于锁处于冲突模式而导致该操作必须等待
acquireCount
锁获取的次数。acquireWaitCount
小于或等于acquireCount
。
system.profile.locks.timeAcquiringMicros
操作获取锁所需等待的累计时间(以微秒为单位)。
timeAcquiringMicros
除以acquireWaitCount
得出特定锁模式的大致平均等待时间。
有关锁模式的更多信息,请参阅MongoDB 使用哪种类型的锁?
system.profile.storage
版本 4.2 中的新增功能:(从 4.0.9 开始也可用)
system.profile.storage
信息提供有关存储引擎数据和操作等待时间的指标。仅当值大于零时,才会返回特定存储指标。
system.profile.storage.data.bytesRead
版本 4.2 中的新增功能:(从 4.0.9 开始也可用)
该操作从磁盘读取到缓存的字节数。
从磁盘读入缓存的数据包括执行查询所需的所有内容。如果数据已在缓存中,则从磁盘读取的字节数可能为
0
。从磁盘读取的字节数超过查询到的文档的字节数:
WiredTiger 以页面为单位读取,一页可能包含一份或多份文档。如果有文档位于某页面,则该页面中的所有文档都会读入缓存并包含在
bytesRead
值中。如果缓存需要页面管理(例如,逐出或重新读取),则
bytesRead
值包括在这些操作中从磁盘读取的数据。如果索引不在缓存中或者缓存中的索引已过时,WiredTiger 会从磁盘读取几个内部页和叶子页,以重建缓存中的索引。
system.profile.storage.data.bytesWritten
版本 4.2 中的新增功能:(从 4.0.9 开始也可用)
操作从缓存写入磁盘的字节数。
WiredTiger 通常不需要将查询写入磁盘。查询修改的数据被写入内存缓存,WiredTiger 将其作为逐出或检查点操作的一部分刷新到磁盘。在这种情况下,
bytesWritten
显示为 0。如果运行查询的线程需要强制页面管理(例如逐出),则 WiredTiger 会将页面内容写入磁盘。此刷新可能包含与查询本身所做的与更改无关的数据,这可能会导致
bytesWritten
显示的值比预期更高。
system.profile.storage.timeWaitingMicros.cache
版本 4.2 中的新增功能:(从 4.0.9 开始也可用)
该操作必须等待缓存中有空间的时间(以微秒为单位)。
system.profile.responseLength
操作结果文档的长度(以字节为单位)。较大的
responseLength
会影响性能。要限制查询操作结果文档的大小,可以使用以下任一方法:注意
当 MongoDB 将查询配置文件信息写入日志时,
responseLength
值位于名为reslen
的字段中。
system.profile.protocol
MongoDB 传输协议请求消息格式。
system.profile.millis
从
mongod
的角度来看,从操作开始到操作结束所用的时间(以毫秒为单位)。
system.profile.execStats
包含查询操作的执行统计信息的文档。对于其他操作,该值为空文档。
system.profile.execStats
将统计信息显示为一棵树;每个节点提供在查询操作的该阶段执行的操作的统计信息。注意
以下
execStats
的字段列表并非详尽无遗,因为返回的字段因阶段而异。
system.profile.appName
运行操作的客户端应用程序的标识符。使用
appName
连接字符串选项设置appName
字段的自定义值。
system.profile.allUsers
用于会话的经过身份验证的用户信息(用户名和数据库)数组。另请参阅用户。