了解应用的动态
- 了解正在进行的操作
db.currentOp();
// Result:
{
"inprog" : [
{
"desc" : "conn46286",
"threadId" : "868",
"connectionId" : 46286,
"client" : "192.168.0.54:26017",
"appName" : "MongoDB Shell",
"clientMetadata" : {
"application" : {
"name" : "MongoDB Shell"
},
"driver" : {
"name" : "MongoDB Internal Client",
"version" : "3.4.0"
},
"os" : {
"type" : "Windows",
"name" : "Microsoft Windows 7",
"architecture" : "x86_64",
"version" : "6.1 SP1 (build 7601)"
}
},
"active" : true,//表示该操作是否正在执行,false代表该操作已交出或等待其他操作交出锁
"opid" : 7617093,//该操作唯一标识符,可以通过它终止一个操作
"secs_running" : 0,
"microsecs_running" : NumberLong(36),//该操作已运行时间
"op" : "command", //操作的类型
"ns" : "admin.$cmd",
"query" : {
"currentOp" : 1
},
"numYields" : 0,//该操作交出锁,让别的操作的执行的次数
"locks" : {
},
"waitingForLock" : false,
"lockStats" : {
}
}
],
"ok" : 1
}
- 终止有问题的操作
通过传入opid作为参数,交出锁的进程才能被终止(更新、查找、删除可以被终止),正在占用或等待锁无法被终止
db.killOp(opid);
- 使用系统分析器
profile来查找耗时过长的操作,感觉类似mysql的慢查询日志,都会影响性能,记录在system.profile集合,该集合是一个capped集合(固定大小的集合,可以手动删除在新建调整集合大小)
关于datasize/storeagesize/filesize
有一篇很好的文章介绍三者的区别
- 但需要补充的是filesize只限定与mmap引擎才有,wired-tiger没有这个参数
- storagesize 和 filesize都只针对数据相关,都不包括索引大小。storeagesize比filesize 空间理论上只多出删除文档原来占有的空间,但是在wired-tiger引擎会对storeagesize 采用snappy压缩算法,导致storagesize实际上比filesize更小(这点比较奇怪)
- filesize其实才是数据库所有部分在磁盘上占有的空间