20230111_性能测试-mongostat监控mongoDB性能并生成图表
MongoDB Database Tools安装
MongoDB4.4之后不再自带mongostat命令,需要手动安装下载MongoDB Database Tools
然而网络上好多过时的资料不会给你强调这一点
安装
... # 登录至mongo所在服务器
cd $存放路径
wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel70-x86_64-100.5.2.rpm
yum install -y cyrus-sasl-gssapi cyrus-sasl-plain
yum install -y cyrus-sasl
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.5.2.rpm
测试
(base) [root@s mongo_tool]# mongostat --host localhost:27017
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 0|0 0.0% 63.2% 0 4.57G 2.94G 0|0 1|0 111b 43.6k 20 Jan 4 14:58:36.840
*0 *0 *0 *0 0 1|0 0.0% 63.2% 0 4.57G 2.94G 0|0 1|0 112b 44.3k 20 Jan 4 14:58:37.833
MongoStat指令
Mongo host及端口
命令默认host为localhost:27017, 如果不是需要修改
mongostat --host localhost:27017
Mongo 数据库是否开启认证
开启认证则需要填写mongoDB用户名,密码以及认证库(一般是admin)
用户需要有测试数据库clusterMonitor角色权限
如何给账户赋予权限?
参照:Manage Users and Roles — MongoDB Manual
如何在mongostat中填写认证信息?
mongostat -h 127.0.0.1:27017 -u root -p 123456 --authenticationDatabase admin
使用无头模式运行
通过
--noheaders
去除header,-n 60 60
代表每60s查询一次状态, 查询60次(60min), 可以根据压测时间灵活配置将状态写入日志中, 后续方便转化为趋势图
mongostat --noheaders -n 60 60>> test.log
其他命令参数可参照Reference官网文档及简书文章
图表生成
代码逻辑:
- 通过pandas读入清洗数据
- 通过pyecharts把数据生成图表
最终会生成一个html图表, 可以作为mongo测试报告使用
import os
import re
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
from pyecharts.charts import Bar, Page
from pyecharts import options as opts
from pyecharts.globals import ThemeType
def text2list(text: str):
temp = text.replace("|", " ").replace("*", " ").replace("G", " ").replace("M", " ").replace("b", " ").replace("k", " ")
return re.split("\s+", temp)
def data_clean(attrs_origin: str, filename: str):
"""获取数据并进行清洗"""
data = pd.read_table(filename)
# list = []
list = []
for i in data.values:
# 删除* , 将|转换为空格
li = text2list(i[0])
# 删除无用参数, 和attr对齐
temp = li[1:20]
temp.append(li[-1])
list.append(temp)
data = pd.DataFrame(list, columns=text2list(attrs_origin))
return data
def series2list(data: pd.DataFrame ,column: str):
# 获取1列数据
data_str = list(data[column])
return list(map(eval, data_str))
if __name__ == '__main__':
# 数据清洗 : attrs_origin一般不需要动, 指定filename
attrs_origin = "insert query update delete getmore command|command2 dirty used flushes vsize res qr|qw ar|aw net_in net_out conn time"
filename = "test_s10.log"
data = data_clean(attrs_origin, filename)
# 图表生成
time_data = list(map(lambda x:x[0:5] ,data['time']))
# 将文本转化为数字
insert = series2list(data, "insert")
query = series2list(data, "query")
update = series2list(data, "update")
delete = series2list(data, "delete")
flushes = series2list(data, "flushes")
res = series2list(data, "res")
ar = series2list(data, "ar")
aw = series2list(data, "aw")
qr = series2list(data, "qr")
qw = series2list(data, "qw")
conn = series2list(data, "conn")
# 使用pyecharts形成图表
page = Page(layout=Page.DraggablePageLayout)
bar1 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_data)
.add_yaxis("insert", insert)
.add_yaxis("query", query)
.add_yaxis("update", query)
.add_yaxis("delete", query)
.set_global_opts(title_opts=opts.TitleOpts(title="Mongo增删改查监控图", subtitle="此曲线图反映了Mongo执行增删改查命令的次数变化"))
)
bar2 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_data)
.add_yaxis("flushes", flushes)
.set_global_opts(title_opts=opts.TitleOpts(title="Mongo flushes监控图", subtitle="此曲线图反映了Mongo缓存数据的频率, 长期为1则可能存在性能问题"))
)
bar3 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_data)
.add_yaxis("account read", ar)
.add_yaxis("account write", aw)
.add_yaxis("queue read,", qr)
.add_yaxis("queue write", qw)
.set_global_opts(title_opts=opts.TitleOpts(title="Mongo读写队列监控图", subtitle="此曲线图反映了Mongo执行读写操作和等待读写操作的客户端数量, 一直在累计增大则可能存在性能问题"))
)
bar4 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_data)
.add_yaxis("conn", conn)
.set_global_opts(title_opts=opts.TitleOpts(title="Mongo conn连接监控图", subtitle="此曲线图反映了qr,qw,ar,aw连接总数,建议在5000以下"))
)
page.add(bar1, bar2, bar3, bar4)
page.render("test.html")
os.system("test.html")
pyecharts效果示例
监控指标
指标 | 异常情况 | |
---|---|---|
flush | 把缓存数据强行输入,1则为进行了flush操作 | 频繁为1则为异常 |
res | 物理内容使用量 | 突然下降则为异常 |
ar | account read,执行读操作的活跃客户端数量 | 数值很大则为异常 |
aw | account write,执行写操作的活跃客户端数量 | 数值很大则为异常 |
qr | queue read,读操作的队列长度 | 一直在累计增大 |
qw | queue write,写操作的队列长度 | 一直在累计增大 |
conn | 连接总数,qr,qw,ar,aw综合 | 建议在5000以下 |
其他打印参数可参照Reference
Reference
官方文档重点信息摘录
- mongostat开发用于快速总览运行中mongo及实例状态信息
- 在系统命令行运行mongostat,而不是在mongo shell
- mongo4.4之后, mongostat从mongo服务器中独立出来,此前是mongo自带
- mongostat支持所有x86架构不同系统的服务器
- mongostat tool是MongoDB Database Tools的一部分, 安装MDT来使用mongostat
- 如果开启了认证, 使用者要拥有
clusterMonitor
角色的账户,并且在mongo命令中指定账号密码 - mongostat会使用FIPS模式自动连接mongoDB
- 官方文档还提供了命令参数和打印参数的详细解读
很多中文二手资料失真严重, 有条件多看看官方文档
参考文档:
mongostat参考文档:
011.MongoDB性能监控 - 腾讯云开发者社区-腾讯云 (tencent.com)
mongostat — MongoDB Database Tools
mongodb用户创建以及权限控制 - 简书 (jianshu.com)
(86条消息) mongodb监控工具mongostat_神奇时代的博客-CSDN博客_mongostate
图表生成参考文档:
(90条消息) 【宝藏级】PyEcharts 超详细的使用指南_奇怪的大象的博客-CSDN博客_pycharts
(90条消息) pd.read_csv用法_此间的少年1128的博客-CSDN博客_pd.read_csv
[(90条消息) pyecharts]如何使用Python将多个图表生成到一个HTML中?_baosenzhang的博客-CSDN博客_pyecharts图表挂载到html元素