MongoDB 监控(十一)serverStatus
这是 MongoDB 监控系列文章的第十一篇,前面几篇文章的链接如下:
- MongoDB 监控(一)
- MongoDB 监控(二)
- MongoDB 监控(三)
- MongoDB 监控(四)
- MongoDB 监控(五)
- MongoDB 监控(六)
- MongoDB 监控(七)
- MongoDB 监控(八)
- MongoDB 监控(九)
- MongoDB 监控(十)
各类数据库的监控方法都很类似,都是 agent 作为 client 连上去,执行一些命令获取各类指标。即:数据库本身提供了各类指标,但是不会直接暴露为 Prometheus metrics 等固定规范格式。通常每个库都是按照自己的格式输出,MongoDB 的话就是输出位 BSON 格式的数据。
之前系列的文章,我们已经介绍了诸如 db.stats()
和 rs.status()
这样的命令,本文介绍 db.serverStatus()
,serverStatus 提供了非常多的指标,我甚至怀疑 MongoDB 自己的某个研发人员都未必能搞明白所有指标。本文我们挑选一部分比较重要的指标做简要说明。
参考文章:https://developer.aliyun.com/article/405274
Connection
mongos [direct: primary] admin> db.serverStatus().connections
{
current: 56,
available: 838804,
totalCreated: 203,
rejected: 0,
active: 10,
threaded: 56,
exhaustIsMaster: Long('0'),
exhaustHello: Long('7'),
awaitingTopologyChanges: Long('7'),
loadBalanced: Long('0')
}
作为一款 DB,连接数是肯定要监控的,当前连接数、可用连接数、总创建连接数、被拒绝连接数、活跃连接数等都是比较重要的指标。你可以配置一些告警规则,在可用连接数低于某个阈值时报警,另外也建议配置某个时间出现拒绝连接的时候告警。
Asserts
mongos [direct: primary] admin> db.serverStatus().asserts
{
regular: 0,
warning: 0,
msg: 0,
user: 1762,
tripwire: 0,
rollovers: 0
}
上例中 user 的 asserts 是 1762,表示用户操作引起的异常,比如你敲错了命令之类的。regular 和 warning 通常是 0,如果不为 0 需要关注,可以配置告警规则。
globalLock
mongos [direct: primary] admin> db.serverStatus().globalLock
{
totalTime: Long('82471123000'),
currentQueue: { total: 0, readers: 0, writers: 0 },
activeClients: { total: 0, readers: 0, writers: 0 }
}
globalLock 是 MongoDB 的全局锁,totalTime 是全局锁的总时间,currentQueue 是当前队列的情况,activeClients 是当前活跃的客户端情况。如果 currentQueue 较高表示有锁等待。
Locks
mongos [direct: primary] admin> db.serverStatus().locks
{
MultiDocumentTransactionsBarrier: { acquireCount: { W: Long('8') } },
ReplicationStateTransition: {
acquireCount: { w: Long('1877920'), W: Long('2') },
acquireWaitCount: { w: Long('1') },
timeAcquiringMicros: { w: Long('9683') }
},
Global: {
acquireCount: { r: Long('2120459'), w: Long('900278'), W: Long('8') },
acquireWaitCount: { r: Long('1') },
timeAcquiringMicros: { r: Long('553') }
},
Database: {
acquireCount: { r: Long('11282'), w: Long('809626'), R: Long('1'), W: Long('1') }
},
Collection: {
acquireCount: { r: Long('56627'), w: Long('809612'), W: Long('9') }
},
Mutex: { acquireCount: { r: Long('19') } },
oplog: { acquireCount: { r: Long('2834'), w: Long('2') } }
}
Locks 是颗粒度更小的锁,其中小写的 r、w 表示意向锁,类似乐观锁,即虽然使用了锁但事实上并没有锁住数据。大写的 R、W 是排它锁,它们的值也是累计值,通过它们每秒的增值,我们可以判断出我们系统的健康状况及业务访问的合理程度。
Network
mongos [direct: primary] admin> db.serverStatus().network
{
bytesIn: Long('138851496'),
bytesOut: Long('1311199561'),
physicalBytesIn: Long('70953833'),
physicalBytesOut: Long('1269348251'),
numSlowDNSOperations: Long('0'),
numSlowSSLOperations: Long('0'),
numRequests: Long('322757'),
tcpFastOpen: {
kernelSetting: Long('1'),
serverSupported: false,
clientSupported: false,
accepted: Long('0')
},
compression: {
snappy: {
compressor: { bytesIn: Long('169469387'), bytesOut: Long('120402691') },
decompressor: { bytesIn: Long('118296614'), bytesOut: Long('206296460') }
},
zstd: {
compressor: { bytesIn: Long('0'), bytesOut: Long('0') },
decompressor: { bytesIn: Long('0'), bytesOut: Long('0') }
},
zlib: {
compressor: { bytesIn: Long('0'), bytesOut: Long('0') },
decompressor: { bytesIn: Long('0'), bytesOut: Long('0') }
}
},
serviceExecutors: {
passthrough: {
threadsRunning: 56,
clientsInTotal: 56,
clientsRunning: 56,
clientsWaitingForData: 0
},
inline: {
threadsRunning: 0,
clientsInTotal: 0,
clientsRunning: 0,
clientsWaitingForData: 0
}
},
listenerProcessingTime: { durationMicros: Long('280117') }
}
某个时刻如果发现 MongoDB 访问慢,就可以来查看 network 相关的指标,是不是突发流量导致的。这里的值基本都是累加值,单调递增,需要使用 irate、rate 等函数来计算每秒的增量才比较有价值。
Opcounters
mongos [direct: primary] admin> db.serverStatus().opcounters
{
insert: Long('2'),
query: Long('6445'),
update: Long('1071'),
delete: Long('70'),
getmore: Long('50466'),
command: Long('279910')
}
opcounters 是操作计数器,包括 insert、query、update、delete、getmore、command 等,这些值是累加值,可以通过计算每秒的增量来判断系统的健康状况。command 是除了 insert、query、update、delete、getmore 之外的操作,比如创建索引、删除索引、执行 db.runCommand()
等。
Memory
mongos [direct: primary] admin> db.serverStatus().mem
{
bits: 64,
resident: 151,
virtual: 2941,
supported: true,
secureAllocByteCount: 288,
secureAllocBytesInPages: 4096
}
Memory 是内存相关的指标,resident 是 MongoDB 进程占用的常驻内存,virtual 是 MongoDB 进程占用的虚拟内存。
Metrics
db.serverStatus().metrics
这个结果太多了,就不贴了。就是各种命令执行的数量统计,比如 metrics | command | failed
记录了命令失败的总次数,metrics | command | total
记录了命令执行的总次数。metrics | document | delete
等记录了对 Document 操作的次数。
wiredTiger
db.serverStatus().wiredTiger
这个结果也太多了,就不贴了。主要是关于 WiredTiger 存储引擎的指标,比如 wiredTiger | cache | bytes currently in the cache
记录了当前缓存的字节数,wiredTiger | cache | maximum bytes configured
记录了最大缓存的字节数。
总结
serverStatus 是 MongoDB 监控最关键的命令,内容较多,可以分成多个类别,本文只能算是让大家有个概要认识,具体细节我也还需要再研究。如果你对这块比较熟悉,欢迎分享你的 MongoDB 监控经验呀。