
这是 MongoDB 监控系列文章的第八篇,前面几篇文章的链接如下:
上一篇文章我们大概浏览了 MongoDB 的 Grafana 仪表盘,从仪表盘中大概了解到了一些较为关键的指标。实际还有另一个方法来辅助我们获知哪些信息较为重要,就是使用 mongostat 命令。mongostat 命令是类似 vmstat 的工具,可以实时查看 MongoDB 的运行状态,包括连接数、查询数、更新数、删除数、命中数、未命中数等等。我们看看 mongostat 的输出中包含哪些指标,就能知道哪些指标比较关键。
核心要点
mongostat是观察 MongoDB 实时运行状态的命令行工具,适合用来理解哪些运行指标值得进入监控系统。- 输出中的
insert、query、update、delete、getmore、command反映操作吞吐;dirty、used、flushes反映 WiredTiger 缓存和 checkpoint 情况。 qrw、arw、conn、net_in、net_out分别对应队列、活跃读写、连接数和网络流量,排查性能问题时很常用。set和repl字段只在相关场景下出现,可用于辅助判断副本集名称和当前实例角色。
mongostat 命令的输出
使用如下命令可以启动 mongostat 命令,连到某个 MongoDB 实例:
mongostat -u username -p password --host 10.99.1.110 --port 27017 --authenticationDatabase admin
上面的命令中,-u 是用户名,-p 是密码,--host 是 MongoDB 实例的 IP 地址,--port 是 MongoDB 实例的端口号,--authenticationDatabase 是认证数据库。换成你自己的认证信息。mongostat 的输出如下:
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 4|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 416b 58.5k 134 Nov 15 17:49:13.871
*0 *0 *0 *0 0 5|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 533b 59.3k 134 Nov 15 17:49:14.869
*0 *0 *0 *0 0 4|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 612b 58.6k 134 Nov 15 17:49:15.879
*0 *0 *0 *0 0 1|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 113b 58.9k 134 Nov 15 17:49:16.861
*0 *0 *0 *0 0 1|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 259b 58.1k 134 Nov 15 17:49:17.862
*0 *0 *0 *0 0 2|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 311b 56.6k 134 Nov 15 17:49:18.897
*0 *0 *0 *0 0 75|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 15.7k 228k 134 Nov 15 17:49:19.948
*0 *0 *0 *0 0 0|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 111b 57.6k 134 Nov 15 17:49:20.953
*0 *0 *0 *0 0 1|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 123b 63.6k 134 Nov 15 17:49:21.864
*0 3 *0 *0 0 6|0 0.1% 14.9% 0 2.17G 607M 0|0 0|0 2.08k 78.1k 134 Nov 15 17:49:22.860
默认 mongostat 每秒采集一次数据,当然你可以调整采集频率,通过 mongostat --help 可以看到有哪些选型可以调整。mongostat 输出的各个字段的含义有:
操作量字段
insert:每秒插入数据库的对象数,如果后面跟着星号(*),则该数据指的是复制操作。query:每秒执行查询的次数。update:每秒执行更新的次数。delete:每秒执行删除的次数。getmore:每秒执行 getmore(即光标批处理)操作的次数。command:每秒执行命令的次数。在一个 secondary 节点,会展示两个值,用竖线分隔,前面的值是在本地执行的命令数,后面的值是复制执行的命令数。
这些字段对应的是数据库 workload 的基本形态。排查时不要只看某一列,要把操作量和延迟、连接数、网络流量放在一起看:操作量升高导致延迟升高,和操作量平稳但延迟升高,排查方向不同。
WiredTiger 缓存和存储字段
dirty:只用于 WiredTiger 存储引擎(这是现在通常使用的存储引擎),WiredTiger cache 中的脏数据的百分比。计算方法是wiredTiger.cache.tracked dirty bytes in the cache / wiredTiger.cache.maximum bytes configuredused:只用于 WiredTiger 存储引擎,表示 WiredTiger cache 中已使用数据的百分比。计算方法是wiredTiger.cache.bytes currently in the cache / wiredTiger.cache.maximum bytes configuredflushes:只用于 WiredTiger 存储引擎,表示在上个轮询周期内触发了多少次 checkpoint。vsize:虚拟内存的大小。res:常驻内存大小。
dirty 和 used 更适合观察缓存压力和趋势,vsize、res 则帮助判断进程内存占用。它们不应孤立解释,需要结合机器内存、业务负载和 MongoDB 配置来判断是否异常。
队列、网络和连接字段
qrw:读写操作的队列长度。arw:活跃读写操作次数。net_in:每秒接收的字节数。包括了 mongostat 本身触发的网络流量。net_out:每秒发送的字节数。包括了 mongostat 本身触发的网络流量。conn:当前打开的连接数。time:采集时间。
qrw 表示有读写操作排队,是性能排查时值得重点关注的字段。net_in 和 net_out 可以解释网络层面的突增;conn 则要和应用连接池、连接上限以及 rejected 连接一起分析。
副本集字段
set:如果有的话,表示副本集的名字。repl:如果有的话,表示当前实例的副本集状态。repl的可能取值如下PRI: primarySEC: secondaryREC: recoveringUNK: unknownRTR: mongos process (“router”)ARB: arbiter
从 mongostat 到监控指标
mongostat 本身适合临时观察,但生产监控通常还是要由采集器定期采集指标,再写入时序数据库。可以把 mongostat 输出理解为一张“指标优先级清单”:
| mongostat 观察项 | 监控关注点 | 常见用途 |
|---|---|---|
| insert/query/update/delete/getmore/command | 操作吞吐 | 判断业务流量变化和操作类型变化 |
| dirty/used/flushes | WiredTiger cache 和 checkpoint | 观察缓存压力和持久化相关趋势 |
| qrw/arw | 排队和活跃读写 | 识别锁等待或处理能力不足的迹象 |
| net_in/net_out | 网络流量 | 判断是否有流量突增或返回数据异常变大 |
| conn | 当前连接数 | 识别连接池、连接泄露或连接上限风险 |
| repl | 副本集状态 | 判断节点角色是否符合预期 |
总结
mongostat 命令可以实时查看 MongoDB 的运行状态。从输出字段看,MongoDB 监控至少要覆盖实例增删改查次数、WiredTiger 缓存使用、网络流量、队列长度、连接数和副本集状态。如果要制作 MongoDB 监控仪表盘,mongostat 是一个很好的参照,但最终还要结合采集器实际暴露的 metric 名称、标签结构和业务场景来设计图表和告警。
FAQ
Q1:mongostat 适合长期替代监控系统吗? A:不适合。它适合临时观察和学习字段含义,长期监控还是应通过采集器、时序库、仪表盘和告警系统完成。
Q2:mongostat 里带星号的值是什么意思?
A:原文示例里 insert 后如果跟着星号,表示该数据指的是复制操作。分析副本集时要注意这个差异。
Q3:哪些字段最适合做仪表盘第一屏? A:可以优先放操作量、连接数、队列长度、网络流量、WiredTiger cache 使用率和副本集角色。这些字段能覆盖吞吐、资源、可用性和排障入口。
