MongoDB 监控(八)mongostat

介绍 mongostat 的连接方式、输出字段和监控含义,帮助理解 MongoDB 的操作量、WiredTiger 缓存、队列、网络、连接数和副本集状态等关键指标。

作者 快猫实习生

MongoDB 监控

这是 MongoDB 监控系列文章的第八篇,前面几篇文章的链接如下:

上一篇文章我们大概浏览了 MongoDB 的 Grafana 仪表盘,从仪表盘中大概了解到了一些较为关键的指标。实际还有另一个方法来辅助我们获知哪些信息较为重要,就是使用 mongostat 命令。mongostat 命令是类似 vmstat 的工具,可以实时查看 MongoDB 的运行状态,包括连接数、查询数、更新数、删除数、命中数、未命中数等等。我们看看 mongostat 的输出中包含哪些指标,就能知道哪些指标比较关键。

核心要点

  • mongostat 是观察 MongoDB 实时运行状态的命令行工具,适合用来理解哪些运行指标值得进入监控系统。
  • 输出中的 insertqueryupdatedeletegetmorecommand 反映操作吞吐;dirtyusedflushes 反映 WiredTiger 缓存和 checkpoint 情况。
  • qrwarwconnnet_innet_out 分别对应队列、活跃读写、连接数和网络流量,排查性能问题时很常用。
  • setrepl 字段只在相关场景下出现,可用于辅助判断副本集名称和当前实例角色。

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 configured
  • used:只用于 WiredTiger 存储引擎,表示 WiredTiger cache 中已使用数据的百分比。计算方法是 wiredTiger.cache.bytes currently in the cache / wiredTiger.cache.maximum bytes configured
  • flushes:只用于 WiredTiger 存储引擎,表示在上个轮询周期内触发了多少次 checkpoint。
  • vsize:虚拟内存的大小。
  • res:常驻内存大小。

dirtyused 更适合观察缓存压力和趋势,vsizeres 则帮助判断进程内存占用。它们不应孤立解释,需要结合机器内存、业务负载和 MongoDB 配置来判断是否异常。

队列、网络和连接字段

  • qrw:读写操作的队列长度。
  • arw:活跃读写操作次数。
  • net_in:每秒接收的字节数。包括了 mongostat 本身触发的网络流量。
  • net_out:每秒发送的字节数。包括了 mongostat 本身触发的网络流量。
  • conn:当前打开的连接数。
  • time:采集时间。

qrw 表示有读写操作排队,是性能排查时值得重点关注的字段。net_innet_out 可以解释网络层面的突增;conn 则要和应用连接池、连接上限以及 rejected 连接一起分析。

副本集字段

  • set:如果有的话,表示副本集的名字。
  • repl:如果有的话,表示当前实例的副本集状态。repl 的可能取值如下
    • PRI: primary
    • SEC: secondary
    • REC: recovering
    • UNK: unknown
    • RTR: 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 使用率和副本集角色。这些字段能覆盖吞吐、资源、可用性和排障入口。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云