性能测试-mongostat监控mongoDB性能


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元素


Author: Feny Lau
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Feny Lau !
  TOC