自从上一篇文章聊聊非关系型数据库MongoDB索引,大家反响还不错,今天我们继续聊下mongo的服务命令,通过下面几个命令让你更加了解自己mongo服务应用状态。
一、使用db.currentOp()函数
该函数会列出数据库正在进行的所有操作,最常用的作用就是寻找速度较慢的操作。
opid 操作的唯一标志符,可以通过它来终止操作,通过db.killOp(opid)来终止该操作的执行。
op 表示操作类型,查询,插入,更新,删除一种
secs_running 表示该操作已经执行的时间。通过它来判断那些查询耗时过长,或者占用了过多的数据库资源。
默认currentOp()操作展示很多的数据,可以通过添加过滤条件展示符合展示结果,如下面。
二、系统分析器setProfilingLevel
查询耗时过长的操作,可以用系统分析器(system profiler)进行setProfilingLevel开启。
设置0, 关闭分析器
设置2,开启分析器会记录所有内容,所有读写记录在system.profile集合,但这会造成一定性能损失。
设置1,默认只显示长耗时(> 100ms)操作,也可以自己设置比如300ms, 这里不要将值设置过低,否则即使关闭了分析器,超过slowms值操作也会出现在日志中。
这种方式能更好发现,我们查询的耗时在哪儿,随时进行优化我们的应用的操作。
scanv_rs:PRIMARY> db.setProfilingLevel(1,300) { "was" : 0, # 状态 "slowms" : 100, # 慢查询时间 "sampleRate" : 1, "ok" : 1, "operationTime" : Timestamp(1541420614, 1), "$clusterTime" : { "clusterTime" : Timestamp(1541420614, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } }
三、使用stats函数显示集合或数据库的值
比如 db.users.stats(),db.stats() 在线上列出数据库信息会拖慢数据库操作,需要注意不要在高峰期执行这类操作。
scanv_rs:PRIMARY> db.stats() "objects" : 1000000, # 文档总数 "avgObjSize" : 87.88889, "dataSize" : 87888890, # 此数据库数据占用空间大小 "storageSize" : 27336704, # 数据库正在使用的总空间大小 "numExtents" : 0, "indexes" : 3, "indexSize" : 33841152, "fsUsedSize" : 223878615040, "fsTotalSize" : 249779191808, "ok" : 1, "operationTime" : Timestamp(1541421778, 1), "$clusterTime" : { "clusterTime" : Timestamp(1541421778, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } }
四、使用mongotop和mongostat
mongotop类似unix命令top命令,mongostat提供服务器信息,默认每秒输出一次包含当前状态列表
通过上面的几个命令,我们便能够更加了解我们服务发生了什么,以及该做一些什么来改变应用的状态,比如加索引,调整查询条件等等方式,让我们的服务时刻保持最佳状态。