Database Profiler
在本页面
数据库分析器收集有关正在运行的mongod实例执行的Database Commands的详细信息。这包括 CRUD 操作以及配置和 Management 命令。探查器将收集到的所有数据写入admin
数据库中的capped collection的system.profile集合。有关分析器创建的system.profile文档的概述,请参见数据库探查器输出。
探查器默认为off
。您可以在每个profiling levels的数据库或实例上启用分析器。
本文档概述了数据库分析器的许多关键 Management 选项。有关其他相关信息,请考虑以下资源:
Profiling Levels
提供以下分析级别:
Level | Description |
---|---|
0 | 探查器已关闭,并且不收集任何数据。这是默认的探查器级别。 |
1 | 分析器收集的操作数据所花费的时间比slowms 的时间长。 |
2 | 探查器收集所有操作的数据。 |
启用和配置数据库分析
您可以使用mongo shell 或使用profile命令通过驱动程序来启用数据库分析。本节将说明如何通过mongo shell 执行此操作。如果要从应用程序内部控制探查器,请参见driver documentation。
启用性能分析时,还需要设置profiling level。探查器将数据记录在system.profile集合中。对数据库启用概要分析后,MongoDB 将在数据库中创建system.profile集合。
要启用概要分析并设置概要分析级别,请在mongo shell 中使用db.setProfilingLevel() helper,并将概要分析级别作为参数传递。例如,要对所有数据库操作启用概要分析,请在mongo shell 中考虑以下操作:
db.setProfilingLevel(2)
Shell 程序返回一个文档,该文档显示概要分析级别。 "ok" : 1
键值对表示操作成功:
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
要验证新设置,请参见检查配置文件级别部分。
指定慢速操作的阈值
要更改慢速操作阈值,请通过以下方式之一指定所需的阈值:
-
使用profile命令或db.setProfilingLevel() shell 帮助器方法设置
slowms
的值。 -
在启动时从命令行设置--slowms的值。
默认情况下,慢速操作阈值为 100 毫秒。分析级别为1
的数据库将分析操作的速度低于阈值。
例如,以下代码将当前数据库的性能分析级别设置为1
,并将mongod实例的慢速操作阈值设置为 20 毫秒:
db.setProfilingLevel(1, { slowms: 20 })
Important
慢速操作阈值适用于mongod实例中的所有数据库。数据库分析器和系统日志都使用它,并且应将其设置为最大有用值,以避免性能下降。
对于从版本 3.6.11 开始的 MongoDB 3.6 部署,副本集的辅助成员现在为记录操作日志条目,所花费的时间超过了慢操作阈值。这些慢速 oplog 消息将在文本applied op: <oplog entry> took <num>ms
下的REPL组件下的diagnostic log中记录。这些慢操作日志条目仅取决于慢操作阈值。它们不取决于日志级别(系统级别或组件级别),配置级别或运行缓慢的采样率。探查器不会捕获缓慢的操作日志条目。
随机抽取慢速操作 samples
3.6 版的新功能。
要仅分析所有* slow *操作的随机采样子集,请通过以下方式之一指定所需的采样率:[1]
-
使用profile命令或db.setProfilingLevel() shell 帮助器方法设置
sampleRate
的值。 -
在启动时从命令行设置--slowOpSampleRate的值。
默认情况下,sampleRate
设置为1.0
,这意味着将对所有* slow 操作进行分析。当sampleRate
设置为 0 到 1 之间时,配置文件级别为1
的数据库将仅根据sampleRate
随机抽取百分比的 slow *操作。
例如,以下方法将当前数据库的概要分析级别设置为1
,并将探查器设置为对所有* slow *操作采样 42%:
db.setProfilingLevel(1, { sampleRate: 0.42 })
Important
采样率值适用于mongod实例中的所有数据库。数据库分析器和系统日志都使用它。
Important
当logLevel设置为0
时,MongoDB 以slowOpSampleRate确定的速率将* slow *操作记录到诊断日志中。对于从版本 3.6.11 开始的 MongoDB 3.6 部署,副本集的第二副本将设置日志所有花费比慢操作阈值更长的时间的 oplog 条目消息,而与采样率无关。
在更高的logLevel设置下,所有操作都将显示在诊断日志中,而与它们的延迟无关,但以下情况除外:记录次要节点的操作日志 Importing 消息缓慢。辅助服务器仅记录慢速操作日志条目;增加logLevel不会记录所有操作日志条目。
检查配置文件级别
要查看profiling level,请从mongo shell 发出以下命令:
db.getProfilingStatus()
Shell 返回类似于以下内容的文档:
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
was
字段指示当前配置文件级别。
slowms
字段表示操作时间阈值(以毫秒为单位),超过该时间阈值将被视为* slow *。
sampleRate
字段指示应配置的* slow *操作的百分比。
要仅返回概要分析级别,请使用mongo shell 中的db.getProfilingLevel()帮助器,如下所示:
db.getProfilingLevel()
Disable Profiling
要禁用分析,请在mongo shell 中使用以下帮助器:
db.setProfilingLevel(0)
为整个 mongod 实例启用分析
为了在测试环境中进行开发,可以为整个mongod实例启用数据库分析。分析级别适用于mongod实例提供的所有数据库。
要为mongod实例启用性能分析,请在启动时将以下选项传递给mongod。
mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5
或者,您可以在configuration file中指定operationProfiling。
这会将概要分析级别设置为1
,将慢速操作定义为持续时间长于15
毫秒的操作,并指定仅应配置* slow *操作的 50%。 [1]
logLevel设置为0
时,slowms
和slowOpSampleRate
还影响将哪些操作记录到诊断日志中。
See also
数据库分析和分片
您不能在mongos实例上启用分析。要在分片群集中启用性能分析,必须为群集中的每个mongod实例启用性能分析。
查看分析器数据
数据库分析器在system.profile集合中记录有关数据库操作的信息。
要查看分析信息,请查询system.profile集合。您可以使用$comment将数据添加到查询文档中,以便更轻松地分析探查器中的数据。要查看示例查询,请参见探查器数据查询示例。
有关输出数据的说明,请参见数据库探查器输出。
Profiler 数据查询示例
本节显示对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 } )
显示最近的五个事件
在已启用概要分析的数据库上,mongoShell 程序中的show profile
帮助器将显示 5 个最近的操作,这些操作至少花费 1 毫秒来执行。从mongo shell 发出show profile
,如下所示:
show profile
Profiler Overhead
启用后,性能分析对性能的影响较小。 system.profile集合是capped collection,默认大小为 1 MB。这种大小的集合通常可以存储数千个概要文件,但是某些应用程序每次操作可能会使用或多或少的配置文件数据。
在主数据库上更改 system.profile 集合的大小
要更改system.profile集合的大小,您必须:
-
Disable profiling.
-
删除system.profile集合。
-
创建一个新的system.profile集合。
-
Re-enable profiling.
例如,要创建新的4000000
字节的system.profile集合,请在mongo shell 中使用以下操作序列:
db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)
更改辅助节点上的 system.profile 集合的大小
要更改secondary上的system.profile集合的大小,您必须停止辅助站点,将其作为独立运行,然后执行上述步骤。完成后,以副本集的成员身份重新启动独立服务器。有关更多信息,请参见对副本集成员执行维护。
[1] | *(1,2)*对于从 3.6.11 版本开始的 MongoDB 3.6 部署,副本集的辅助成员现在记录操作日志条目所花费的时间超过了慢操作阈值。这些慢速 oplog 消息在REPL组件下的diagnostic log中以文本applied op: <oplog entry> took <num>ms 记录在diagnostic log中。这些慢操作日志条目仅取决于慢操作阈值。它们不取决于日志级别(系统级别或组件级别),配置级别或运行缓慢的采样率。探查器不会捕获缓慢的操作日志条目。 |