一 概念
1、简介
Profiler是MongoDB的一个工具,用来记录分析数据库运行时候的慢查询。
2、Profiling Levels
profiler有3个级别
0:关闭
1:只记录操作时间高于阀值的慢查询,阀值默认为100ms
2:记录所有的操作
默认情况下profiler是关闭的,
二 操作
1、开启profiling
1)开启某一个数据库的profiling功能
db.setProfilingLevel(1|2);
2)开启该mongo实例上所有数据库的profiling
在启动的时候使用如下命令
mongod –profile 1 –slowms 15
3)指定慢查询的阀值
改变慢查询的阀值会在整个mongo实例上生效
db.setProfilingLevel(1,20)
注:如果mongoDB有分片,不能再路由服务器上开启此功能,必须在所有的分片上依次开启。
2、关闭profiling
db.setProfilingLevel(0);
当将profiling的级别设置为0时即可关闭profiling功能
3、查看profiling状态
1)字段说明
was:当前profiling级别
slowms:当前profiling阀值
2)查看profiling状态
db.getProfilingStatus()
3)只查看profiling级别
db.getProfilingLevel()
4、改变system.profile的大小
system.profile是一个Capped集合,它的默认固定大小为1Mb,可以手动更改它的大小。
1)关闭profiling
2)删除system.profile集合
3)创建新的system.profile集合并指定其大小
4)重启profiling功能
db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)
注:当需要修改副本集的system.profile的大小时,需要先停止副本集使其单独运行,在修改完之后再重启。
5、查询数据
1)根据操作时间查询
db.system.profile.find({ts : {$gt : new ISODate(“2012-12-09T03:00:00Z”) , $lt : new ISODate(“2012-12-09T03:40:00Z”)}}).pretty()
2)查询操作时间大于5ms的操作
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()
3)查询最近10条慢操作记录
db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()
三 使用
1、Profiler 的效率
开始profiling会对mongodb速度有一定影响,但是不是很严重。Profile的数据保存在system.profile集合中,而这个collection是capped collection,此类集合有固定的大小,所有里面通常保存最近的一些操作记录。
2、优化
1)当nscanned的大小远远大于nreturned大小的时候,说明数据库是从大量的documents中查找我们想要的documents,此时需要对查询条件建立索引。
2)当responseLength的值很大的时候,表示mongodb给client返回了大量的数据,这时候在需要查询时设置该查询需要的字段。
四 输出
1、profiling输出视图
{
"op" : "query",
"ns" : "test.c",
"query" : {
"find" : "c",
"filter" : {
"a" : 1
}
},
"keysExamined" : 2,
"docsExamined" : 2,
"cursorExhausted" : true,
"keysInserted" : 0,
"keysDeleted" : 0,
"writeConflicts" : 0,
"numYield" : 0,
"locks" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(2)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(1)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(1)
}
}
},
"nreturned" : 2,
"responseLength" : 108,
"millis" : 0,
"execStats" : {
"stage" : "FETCH",
"nReturned" : 2,
"executionTimeMillisEstimate" : 0,
"works" : 3,
"advanced" : 2,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 2,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 2,
"executionTimeMillisEstimate" : 0,
"works" : 3,
"advanced" : 2,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keyPattern" : {
"a" : 1
},
"indexName" : "a_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"a" : [
"[1.0, 1.0]"
]
},
"keysExamined" : 2,
"dupsTested" : 0,
"dupsDropped" : 0,
"seenInvalidated" : 0
}
},
"ts" : ISODate("2015-09-03T15:26:14.948Z"),
"client" : "127.0.0.1",
"appName" : "MongoDB Shell",
"allUsers" : [ ],
"user" : ""
}
2、输出详解
1)system.profile.op:
操作的类型,有command、count、distinct、geoNear、getMore、group、insert、mapReduce、query、remove、update。
2)system.profile.ns:
命名空间,该操作所在的数据库及集合
3)system.profile.query 4)system.profile.command:
该操作的执行语句,大于50Kb的部分以省略号表示
5)system.profile.updateobj
update操作中需要被更新的对象
6)system.profile.cursorid
query和getmore操作中游标的Id
7)system.profile.keysExamined
Changed in version 3.2.0:Renamed from system.profile.nscanned.
索引被检索的数量,
8)system.profile.docsExamined
Changed in version 3.2.0: Renamed from system.profile.nscannedObjects.
找出结果所扫描的文档数量
9)system.profile.nmoved
该字段只有在使用MMAPv1存储引擎时会出现
10)system.profile.hasSortStage
Changed in version 3.2.0: Renamed from system.profile.scanAndOrder
hasSortStage是一个布尔值,是指是否可以使用索引的顺序来返回查询的结果,只有当其为true的时候才会展现
11)system.profile.ndeleted
本次操作删除的文档数量
12)system.profile.ninserted
本次操作新增的文档数
13)system.profile.nMatched
update操作中被查询条件匹配的文档数
14)system.profile.nModified
update操作中被修改的文档数
15)system.profile.upsert
update操作中标识upsert选项的一个Boolean值,当true时该字段会显示
16)system.profile.keysInserted 17)system.profile.writeConflicts
18)system.profile.numYield
19)system.profile.locks:
该操作持有锁的信息
a.Lock Type:
Global Represents global lock.
MMAPV1Journal Represents MMAPv1 storage engine specific lock to synchronize journal writes; for non-MMAPv1 storage engines, the mode for MMAPV1Journal is empty.
Database:数据库锁
Collection:集合锁
Metadata Represents metadata lock.
oplog Represents lock on the oplog.
b.Lock Mode:
R:共享锁
W:排他锁
r Represents Intent Shared (IS) lock.
w Represents Intent Exclusive (IX) lock.
子文档
1)acquireCount: 2)acquireWaitCount:
3)timeAcquiringMicros:
4)deadlockCount
20)system.profile.nreturned
该操作返回的文档个数
21)system.profile.responseLength
结果文档的大小,单位bytes
22)system.profile.millis
该操作所耗时间大小
23)system.profile.execStats
query操作的执行计划,如果是别的操作,该字段为空文档
子文档
stage:
inputStages:
24)system.profile.ts
该操作执行的时间
25)system.profile.client
该操作的客户端地址或IP
26)system.profile.appName
New in version 3.4
运行此操作的客户端应用的标识
27)system.profile.allUsers
认证用户的集合
28)system.profile.user
运行此操作的认证用户,如果该操作不是认证用户操纵,该字段为空字符串
参考链接:https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/