三、慢日志
1、查看当前慢日志的开启状态
rs0:PRIMARY> db.getProfilingLevel()
1
rs0:PRIMARY> db.getProfilingStatus()
{ "was" : 1, "slowms" : 10 }
- “was”:
0:不开启
1:记录慢查询日志
2:记录所有查询日志 - “slowms”:
默认100,记录慢日志的阈值,单位为ms
2、慢日志参数设置
基本语法:
db.setProfilingLevel(“was”,“slowms”)
示例:
rs0:PRIMARY> db.setProfilingLevel(1,10)
{ "was" : 1, "slowms" : 10, "ok" : 1 }
3、查看慢日志内容
1、基本命令
db.system.profile.find()
- 查看执行时间超过某一阈值的慢日志:db.system.profile.find({“millis”:{$gt:10000}})
- 查看最新的慢日志信息:db.system.profile.find().sort({$natural:-1}).limit(1)
2、Profile 信息内容详解:
system.profile.op:记录具体做的操作类型(insert、query、update、remove、、getmore、command)
system.profile.ns:该项表明该慢日志是哪个库下的哪个集合所对应的慢日志。
system.profile.query:该项详细输出了慢日志的具体语句和行为
system.profile.keysExamined:该项表明为了找出最终结果MongoDB搜索了多少个key
system.profile.docsExamined:该项表明为了找出最终结果MongoDB搜索了多少个文档
system.profile.keyUpdates:该项表名有多少个index key在该操作中被更改,更改索引键也会有少量的性能消耗,因为数据库不单单要删除旧Key,还要插入新的Key到B-Tree索引中
system.profile.writeConflicts:写冲突发生的数量,例如update一个正在被别的update操作的文档
system.profile.numYield:为了让别的操作完成而屈服的次数,一般发生在需要访问的数据尚未被完全读取到内存中,MongoDB会优先完成在内存中的操作
system.profile.locks:在操作中产生的锁,
锁的种类有多种,如下:
Global Represents global lock.
MMAPV1Journal Represents MMAPv1 storage engine specific lock to synchronize journal writes; for non-MMAPv1 storage engines, the mode forMMAPV1Journal is empty.
Database Represents database lock.
Collection Represents collection lock.
Metadata Represents metadata lock.
oplog Represents lock on the oplog.
锁的模式也有多种,如下:
Lock Mode Description
R Represents Shared (S) lock.
W Represents Exclusive (X) lock.
r Represents Intent Shared (IS) lock.
w Represents Intent Exclusive (IX) lock.
system.profile.locks.acquireCoun:在各种不用的种类下,请求锁的次数
system.profile.nreturned:该操作最终返回文档的数量
system.profile.responseLength:结果返回的大小,单位为bytes,该值如果过大,则需考虑limit()等方式减少输出结果
system.profile.millis:该操作从开始到结束耗时多少,单位为毫秒
system.profile.execStats:包含了一些该操作的统计信息,只有query类型的才会显示
system.profile.execStats.stage:包含了该操作的详细信息,例如是否用到索引
system.profile.ts:该操作执行时的时间
system.profile.client:哪个客户端发起的该操作,并显示出该客户端的ip或hostname
system.profile.allUsers:哪个认证用户执行的该操作
system.profile.user:是否认证用户执行该操作,如认证后使用其他用户操作,该项为空
3、示例
> db.system.profile.find().sort({$natural:-1}).limit(1)
{
"op" : "query", //查询
"ns" : "admin.system.profile", //数据库
"query" : {
"query" : { }, //查询字段
"orderby" : { "$natural" : -1 } //查询条件
},
"ntoreturn" : 1, //
"ntoskip" : 0, //指定skip()方法跳过的文档数量
"nscanned" : 0, //在index中扫描文档数
"nscannedObjects" : 1, //在collection中扫描文档数
"keyUpdates" : 0, //index key更新数
"writeConflicts" : 0, //发生写冲突数
"numYield" : 0, //在数据还没有完全读取到内存时,为了让别的操作完成屈服次数
"locks" : { //R:全局读锁,W全局写锁,r特定数据库读锁,w特定数据库写锁
"Global" : {
"acquireCount" : { "r" : NumberLong(2) } //获取锁的时间消耗
},
"MMAPV1Journal" : {
"acquireCount" : { "r" : NumberLong(1) }
},
"Database" : {
"acquireCount" : { "r" : NumberLong(1) }
},
"Collection" : {
"acquireCount" : { "R" : NumberLong(1) }
}
},
"nreturned" : 1, //返回文档数
"responseLength" : 591, //返回结果集字节长度
"millis" : 1, //操作耗时
"execStats" : { //操作的一些统计信息,只有query才会有
"stage" : "COLLSCAN", //是否使用索引
"filter" : { "$and" : [ ] },
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 1,
"needFetch" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 0, //是否为文件结束符
"invalidates" : 0,
"direction" : "backward",
"docsExamined" : 1
},
"ts" : ISODate("2018-11-16T06:53:42.980Z"), //操作时间
"client" : "127.0.0.1", //操作客户端
"allUsers" : [ { "user" : "root", "db" : "admin" } ], //操作认证用户
"user" : "root@admin" //是否使用认证用户执行的操作,如果不是认证用户则显示为空
}