通常在排查MongoDB的性能时,我们首先想到的是MongoDB自身内置的两个监测命令工具:mongostat和mongotop,通过这两个命令的输出可以了解到当前MongoDB实例的读写情况,现介绍它们的使用,环境为linux环境。
1、mongostat命令
在运行mongod实例的linux机器上运行如下命令:
mongostat --host ip:port -u "用户名" -p "密码" --authenticationDatabase "admin"
(1)参数说明
- ip:MongoDB集群中的路由服务器IP地址或者是某个副本集中主从库的IP地址
- port:路由服务器IP对应的端口号,或者副本集中主从库IP对应的端口号
- 用户名和密码:与上述ip、port所在的机器保持一致,都是相应管理员的账号和密码,若服务器上没有添加权限认证的话,可以不用设置这些参数
- authenticationDatabase:必须是admin库
(2)效果图
在上图中,mongostat命令默认是每隔一秒输出一行数据。
(3)mongostat输出字段说明
字段名称 | 解释描述 |
insert | 每秒插入次数 |
query | 每秒查询次数 |
update | 每秒更新次数 |
delete | 每秒删除次数 |
getmore | 每秒执行getmore次数 |
command | 每秒的命令数,除了插入、查找、更新、删除命令统计外,还统计了别的命令 |
flushes |
对于WiredTiger引擎来说,是指checkpoint的触发次数在一个轮询间隔期间 对于MMAPv1 引擎来说,是指每秒执行fsync将数据写入硬盘的次数 一般flushes都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。 flush开销是很大的,如果频繁的flush,就需要排查一下原因了 |
mapped | 所有的被mmap的数据量 |
vsize | 虚拟内存使用量(在mongostat最后一次调用的总数据) |
res |
物理内存使用量(在mongostat最后一次调用的总数据) vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,就需要排查一下是否存在其他的程序正在消费内存 |
faults | 每秒访问失败数,与内存swap有关 |
qrw | 客户端读写等待队列数量,高并发时,一般队列值会升高 |
arw | 客户端读写活跃个数 |
net_in | 网络带宽压力,MongoDB实例的网络进流量 |
net_out | 网络带宽压力,MongoDB实例的网络出流量 |
conn | 打开连接的总数,是qr,qw,ar,aw的总和 MongoDB为每一个连接创建一个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接数的启动参数maxIncomingConnections |
time | 时间戳 |
(4)官方介绍
2、mongotop命令
在运行mongod实例的linux机器上运行如下命令:
mongotop --host ip:port -u "用户名" -p "密码" --authenticationDatabase "admin" 60
(1)参数说明
- ip:必须是分片集群中主从库的IP地址
- port:必须是分片集群中主从库的端口号
- 用户名和密码:分片集群中副本集管理员权限的账号,若没有添加任何用户的话,那么可以不用设置用户名和密码
- authenticationDatabase:必须是admin库
- 60:表示每隔一分钟就输出一组数据,若不设置这个参数的话,那么默认是每隔一秒就输出一组数据
(2)效果图
在上图中,我们看到两组数据相差一秒钟。
(3)mongotop输出字段说明
字段名出 | 解释说明 |
ns | 全称namespace,由库名+点号+集合名组成 |
total |
指定周期内每次统计mongod实例的读写总耗时时长 (在上图中指定的周期是60秒,默认是1秒) |
read |
指定周期内每次统计的读操作耗时时长 (在上图中指定的周期是60秒,默认是1秒) |
write |
指定周期内每次统计的写操作耗时时长 (在上图中指定的周期是60秒,默认是1秒) |
(4)官方介绍