MongoDB状态值

一、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,也只能等待请求完全处理完毕线程才会退出。

猜你喜欢

转载自blog.csdn.net/qq_42979842/article/details/109266502