文章目录
一、db.serverStatus()
1.1 锁信息
锁定模式 | 描述 |
---|---|
R |
表示共享(S)锁。 |
W |
表示排他(X)锁。 |
r |
表示意图共享(IS)锁。 |
w |
表示Intent Exclusive(IX)锁。 |
rs0:PRIMARY> db.serverStatus().locks
{
"ParallelBatchWriterMode" : { //并行批处理写入模式下的锁信息,4.2新增
"acquireCount" : {
"r" : NumberLong(190252)
}
},
"ReplicationStateTransition" : { //复制状态转换的锁定信息,4.2新增
"acquireCount" : { //在该模式下需要获取的锁资源信息
"w" : NumberLong(1046893),
"W" : NumberLong(2)
},
"acquireWaitCount" : { //由于锁冲突,在获取锁资源时锁等待的次数
"w" : NumberLong(1)
},
"timeAcquiringMicros" : { //持有锁的累计时间
"w" : NumberLong(10527)
}
},
"Global" : { //全局锁
"acquireCount" : {
"r" : NumberLong(1027547),
"w" : NumberLong(19341),
"W" : NumberLong(5)
},
"acquireWaitCount" : {
"w" : NumberLong(1),
"W" : NumberLong(1)
},
"timeAcquiringMicros" : {
"w" : NumberLong(11191),
"W" : NumberLong(90)
}
},
"Database" : { //数据库级别锁
"acquireCount" : {
"r" : NumberLong(693553),
"w" : NumberLong(2778),
"W" : NumberLong(24)
},
"acquireWaitCount" : {
"r" : NumberLong(1),
"W" : NumberLong(2)
},
"timeAcquiringMicros" : {
"r" : NumberLong(11088),
"W" : NumberLong(143)
}
},
"Collection" : { //集合级别锁
"acquireCount" : {
"r" : NumberLong(186641),
"w" : NumberLong(2773),
"R" : NumberLong(1),
"W" : NumberLong(18)
},
"acquireWaitCount" : {
"r" : NumberLong(1)
},
"timeAcquiringMicros" : {
"r" : NumberLong(22532)
}
},
"Mutex" : { //mytex互斥锁
"acquireCount" : {
"r" : NumberLong(674754)
}
},
"oplog" : { //oplog锁
"acquireCount" : {
"r" : NumberLong(502132),
"w" : NumberLong(2),
"W" : NumberLong(1)
}
}
}
1.2 全局锁信息
rs0:PRIMARY> db.serverStatus().globalLock
{
"totalTime" : NumberLong("2651301900000"), //自上次发生lock以来的时间
"currentQueue" : { //锁等待队列信息
"total" : 0, //因为锁而产生的排队的总数
"readers" : 0, //等待读锁而产生的排队数(kQueuedReader)
"writers" : 0 //等待写锁而产生的排队数(kQueuedWriter)
},
"activeClients" : { //活跃连接数信息
"total" : 38, //当前活跃连接数
"readers" : 0, //当前执行读操作的活跃连接数(kActiveReader)
"writers" : 0 //当前执行写操作的活跃连接数(kActiveWriter)
}
}
1.3 内存信息
rs0:PRIMARY> db.serverStatus().mem
{ "bits" : 64, //当前mongod体系架构为64位(32/64)
"resident" : 86, //当前使用的RAM量(以兆字节(MB)为单位)
"virtual" : 1788, //mongod进程使用的虚拟内存的总量(以兆字节(MB)为单位),如果该值显著增加表示可能存在内存泄漏
"supported" : true //底层系统是否支持扩展内存信息
}
1.4 assert信息
rs0:PRIMARY> db.serverStatus().asserts //自mongod进程启动以来引发的断言数目的文档
{
"regular" : 0, //
"warning" : 0, //自mongod进程启动以来引发的警告数
"msg" : 0, //
"user" : 1683, //自mongod进程启动以来引发的“用户断言”数
"rollovers" : 0
}
1.5 连接信息
rs0:PRIMARY> db.serverStatus().connections
{ "current" : 2, //当前连接数
"available" : 1998, //目前仍可允许的最大连接数
"totalCreated" : 3, //mongod创建的连接数(包括已经关闭的连接数)
"active" : 1 //当前活跃连接数
}
1.6 网络流量
rs0:PRIMARY> db.serverStatus().network
{
"bytesIn" : NumberLong(41312), //网络入流量
"bytesOut" : NumberLong(1757153), //网络出流量
"physicalBytesIn" : NumberLong(41312),
"physicalBytesOut" : NumberLong(1757153),
"numRequests" : NumberLong(214), //网络请求次数,为bytesIn、bytesOut提供上下文
"compression" : {
"snappy" : {
"compressor" : {
"bytesIn" : NumberLong(0),
"bytesOut" : NumberLong(0)
},
"decompressor" : {
"bytesIn" : NumberLong(0),
"bytesOut" : NumberLong(0)
}
},
"zstd" : {
"compressor" : {
"bytesIn" : NumberLong(0),
"bytesOut" : NumberLong(0)
},
"decompressor" : {
"bytesIn" : NumberLong(0),
"bytesOut" : NumberLong(0)
}
},
"zlib" : {
"compressor" : {
"bytesIn" : NumberLong(0),
"bytesOut" : NumberLong(0)
},
"decompressor" : {
"bytesIn" : NumberLong(0),
"bytesOut" : NumberLong(0)
}
}
},
"serviceExecutorTaskStats" : {
"executor" : "passthrough",
"threadsRunning" : 2
}
}
1.7 操作延时信息
rs0:PRIMARY> db.serverStatus().opLatencies
{
"reads" : { //读请求延时信息
"latency" : NumberLong(242),
"ops" : NumberLong(2)
},
"writes" : { //写请求延时信息
"latency" : NumberLong(14718),
"ops" : NumberLong(4)
},
"commands" : { //数据库命令延迟信息
"latency" : NumberLong(122386),
"ops" : NumberLong(215)
},
"transactions" : {
"latency" : NumberLong(0),
"ops" : NumberLong(0)
}
}
1.8 各Read Concern级别操作数
rs0:PRIMARY> db.serverStatus().opReadConcernCounters
{ //自mongod进程启动以来各个read concern级别操作数
"available" : NumberLong(0),
"linearizable" : NumberLong(0),
"local" : NumberLong(0),
"majority" : NumberLong(0),
"snapshot" : NumberLong(0),
"none" : NumberLong(8584)
}
1.9 复制信息
rs0:PRIMARY> db.serverStatus().repl
{
"hosts" : [
"192.168.0.199:27017" //当前副本集成员信息
],
"setName" : "rs0",
"setVersion" : 1,
"ismaster" : true, //当前节点是否为primary节点
"secondary" : false, //当前节点是否为secondry节点
"primary" : "192.168.0.199:27017", //primariy信息
"me" : "192.168.0.199:27017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1591517114, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2020-06-07T08:05:14Z"),
"majorityOpTime" : {
"ts" : Timestamp(1591517114, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2020-06-07T08:05:14Z")
},
"rbid" : 1 //回滚标识符
}
1.10 存储引擎信息
rs0:PRIMARY> db.serverStatus().storageEngine
{
"name" : "wiredTiger", //存储引擎
"supportsCommittedReads" : false, //是否支持Read concert的“majorty”
"oldestRequiredTimestampForCrashRecovery" : Timestamp(1591517334, 1),
"supportsPendingDrops" : false,
"dropPendingIdents" : NumberLong(0),
"supportsSnapshotReadConcern" : true,
"readOnly" : false,
"persistent" : true, //是否支持持久化到磁盘
"backupCursorOpen" : false
}
二、db.stats()
2.1 查看某个数据库统计信息
db.db_name.stats() 或者db.runCommand({dbStats : 1,scale : 1073741824})可查看某个数据库下数据存储占用的统计信息。
1)两种查看数据库统计信息方法
use db
db.stats()
use db
db.runCommand({dbStats : 1,scale : 1073741824}) //scale指定单位为GB
2)重要参数解释
rs0:PRIMARY> db.stats()
{
"db" : "test", //数据库名称
"collections" : 13, //集合数
"views" : 0,
"objects" : 106703, //文档数
"avgObjSize" : 76.03043025969279, //每个文档的平均大小(字节为单位)
"dataSize" : 8112675, //未压缩数据总大小;
MMAPv1存储引擎下,datasize包含预分配空间和填充因子,该大小因文档减小而减小;
WiredTiger存储引擎下,datasize可能要比storagesize大,该大小会随着文档的减小而减小
"storageSize" : 2797568, //实际占用磁盘空间总大小(压缩后),该值不会随着文档的remove或者减小而减小,如果存储引擎开启compression的情况下,该值可能会比dataSize小。
"numExtents" : 0,
"indexes" : 14, //索引数目
"indexSize" : 2560000, //索引大小
"fsUsedSize" : 29936922624,
"fsTotalSize" : 37688381440,
"ok" : 1,
"operationTime" : Timestamp(1557390462, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1557390462, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
2.2 查看某个集合统计信息
use db
db.collbame.stats()
use db
db.runCommand({"collStats":"oplog.rs",scale:1048576}) //scale指定单位,单位为MB
三、db.currentOp()
3.1 db.currentOp()查看当前数据库会话执行情况。
db.currentOp()
或者
db.currentOp(
{
"active" : true,
"secs_running" : { "$gt" : 3 },
"ns" : /^db1\./
}
)
3.2 重点关注
client #请求是由哪个客户端发起
opid #操作的opid,可以通过 db.killOp(opid) 直接杀掉会话
secs_running/microsecs_running
#这个值重点关注,代表请求运行的时间,如果这个值特别大,就得注意了,看看请求是否合理
query/ns: #这个能看出是对哪个集合正在执行什么操作
lock*: #还有一些跟锁相关的参数
3.3 关于kill会话
1)断开MongoDB Shell后,连接会关闭,但是连接请求的线程并没有结束,直到命令执行完毕,线程给客户端返回结果时,发现连接已经关闭时才会退出线程。
2)MongoDB并不是发送完killOp后请求就会立刻结束
当连接对应的服务线程在代码逻辑上存储了killPending字段时代码会不断调用该参数检查判断killPending的状态。
发送killOp后,请求要执行到下一个【检查点】,判断killPending=1后才会杀掉当前会话。
3.4 杀掉慢会话
> db.killOp(380692)
{ "info" : "attempting to kill op" }
3.5 db.killOp(opid)的实现原理
每个连接对应的服务线程存储了一个killPending的字段,当发送killOp时,会将该字段置1;请求在执行过程中,可以通过不断的调用OperationContext::checkForInterrupt()来检查killPending是否被设置,如果被设置,则线程退出。
一个请求要支持killOp,必须在请求的处理逻辑里加上checkForInterrupt()检查点才行,否则即使发送了killOp,也只能等待请求完全处理完毕线程才会退出。