Mongo性能分析工具

目录

1.mongostat--状态检测工具

2.mongotop--读写操作耗时分析

3.慢日志分析和优化

3.1.开启慢日志

3.1.1.通过命令开启

3.1.2.通过配置文件开启

3.1.3.启动命令配置

3.2.慢日志查看

4.使用mtools分析MongoDB日志文件

4.1.mtools的安装

4.2.mloginfo

4.3.mlogfilter


        MongoDB 是一个颇受欢迎的 NoSQL 数据库,它提供了高度的可伸缩性和灵活的数据模型,以及更好的查询效率。在生产环境中使用 MongoDB,我们需要对其性能进行监控,以便及时发现潜在的问题,提升系统的稳定性和可靠性。

1.mongostat--状态检测工具

用于监控MongoDB实例的状态和性能指标,包括每秒的增查删改次数,连接数等指标。

mongostat常用命令选项:
    --host :指定IP地址和端口,也可以只写IP,然后使用--port参数指定端口号
    --username: 如果开启了认证,则需要在其后填写用户名
    --password : 不用多少,肯定是密码
    --authenticationDatabase:若开启了认证,则需要在此参数后填写认证库
(注意是认证上述账号的数据库)

 执行命令:

mongostat --host 192.168.60.205:27017 --username root --password Admin100% --authenticationDatabase xxx

C:\Users\xxxx>mongostat --host 192.168.60.205:27017 --username root --password Admin100% --authenticationDatabase 5g_tr

insert query update delete getmore command dirty  used flushes vsize   res qrw arw net_in net_out conn  set repl                time
    *0    12     *0     *0       0     4|0  0.2% 69.6%       0 7.97G 6.17G 0|0 3|0  6.79k   48.8k   33 repl  PRI Jul 12 15:05:56.375
    *0     9     *0     *0       0     6|0  0.2% 69.6%       0 7.97G 6.17G 0|0 3|0  3.98k   46.7k   33 repl  PRI Jul 12 15:05:57.372
   190   197     *0    190       0   191|0  0.4% 69.6%       0 7.97G 6.17G 0|0 2|0   316k    583k   33 repl  PRI Jul 12 15:05:58.374
   242   247     *0    242       0   242|0  0.4% 69.6%       0 7.97G 6.17G 0|0 2|0   400k    335k   33 repl  PRI Jul 12 15:05:59.372
   240   247     *0    240       0   243|0  0.4% 69.6%       0 7.97G 6.17G 0|0 3|0   399k    334k   33 repl  PRI Jul 12 15:06:00.372
   254   268      1    255       0   255|0  0.4% 69.6%       0 7.97G 6.17G 0|0 2|1   426k    355k   33 repl  PRI Jul 12 15:06:01.374
  1071  1106     *0     70       1    75|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0   797k   1.03m   33 repl  PRI Jul 12 15:06:02.373
    *0   215     *0     *0       0     0|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  65.5k    154k   33 repl  PRI Jul 12 15:06:03.382
    *0   212     *0     *0       0     3|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  65.1k    154k   33 repl  PRI Jul 12 15:06:04.375
    *0   211     *0     *0       0     3|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  65.0k    154k   33 repl  PRI Jul 12 15:06:05.371
insert query update delete getmore command dirty  used flushes vsize   res qrw arw net_in net_out conn  set repl                time
    *0   202     *0     *0       0     2|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  63.6k    149k   33 repl  PRI Jul 12 15:06:06.374
    *0   162     *0     *0       0     6|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  50.4k    130k   33 repl  PRI Jul 12 15:06:07.372
    *0     8     *0     *0       0     0|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  3.19k   43.1k   33 repl  PRI Jul 12 15:06:08.373
    *0     8     *0     *0       0     0|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  3.18k   43.1k   33 repl  PRI Jul 12 15:06:09.374
    *0     7     *0     *0       0     2|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  2.70k   42.6k   33 repl  PRI Jul 12 15:06:10.371
    *0    16      1     *0       0     0|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  8.59k   49.0k   33 repl  PRI Jul 12 15:06:11.372
    *0     8     *0     *0       0     2|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  3.49k   44.5k   33 repl  PRI Jul 12 15:06:12.373
    *0     6     *0     *0       0     0|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  2.53k   41.8k   33 repl  PRI Jul 12 15:06:13.373
    *0     8     *0     *0       0     2|0  0.5% 69.6%       0 7.97G 6.17G 0|0 3|0  3.50k   44.5k   33 repl  PRI Jul 12 15:06:14.374
    *0     8     *0     *0       0     3|0  0.5% 69.6%       0 7.97G 6.17G 0|0 2|0  3.28k   43.4k   33 repl  PRI Jul 12 15:06:15.374

结果分析:

        insert/s : 官方解释是每秒插入数据库的对象数量,如果是slave,则数值前有*,则表示复制集操作
        query/s : 每秒的查询操作次数
        update/s : 每秒的更新操作次数
        delete/s : 每秒的删除操作次数
        getmore/s: 每秒查询cursor(游标)时的getmore操作数
        command: 每秒执行的命令数,在主从系统中会显示两个值(例如 3|0),分表代表 本地|复制命令, 注: 一秒内执行的命令数比如批量插入,只认为是一条命令(所以意义应该不大)

        dirty: 仅仅针对WiredTiger引擎,官网解释是脏数据字节的缓存百分比
        used:仅仅针对WiredTiger引擎,官网解释是正在使用中的缓存百分比

        flushes:For MMAPv1 引擎:每秒执行fsync将数据写入硬盘的次数

        注:一般都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。flush开销是很大的,如果频繁的flush,可能就要找找原因了

        vsize: 虚拟内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
res:  物理内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)

        注:这个和你用top看到的一样, vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,去查查是否有别的程序占用大量内存。

        res:  物理内存使用量,单位MB

         注:这个和你用top看到的一样, vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,去查查是否有别的程序占用大量内存

        qrw、arw:分别表示读写队列长度和活跃连接数;

        net_in、net_out:表示当前秒内 MongoDB 进程输入/输出的数据量,单位为 bytes;

        conn:表示当前连接数

2.mongotop--读写操作耗时分析

每秒分析排名前十的collections的读写耗时情况

mongostop 常用命令选项:
--help:显示帮助信息
--version:显示版本信息
-v, --verbose=:详细模式,多个v可以增加详细输出,如-vvvv
--quiet:隐藏所有日志输出
-h, --host=:主机信息(主机名或IP地址)
--port=:端口
-u, --username=:指定链接的用户名
-p, --password=:指定链接的用户密码
--authenticationDatabase=:指定用户认证库
--authenticationMechanism=:指定认证机制
--locks:查看数据库锁情况
-n, --rowcount=:指定显示行数
--json:输出格式为JSON

执行命令:

mongotop --host 192.168.60.205 --port 27017    

mongotop --host 192.168.60.205 --port 27017	


2023-07-12T15:14:14.773+0800    connected to: mongodb://192.168.60.205:27017/

                         ns     total      read    write    2023-07-12T15:14:15+08:00
xxx.action_history    1107ms    1107ms      0ms
                xxx.alarm    1067ms    1067ms      0ms
             local.oplog.rs       2ms       2ms      0ms
        xxx.history       0ms       0ms      0ms
      xxx.knowledge       0ms       0ms      0ms
       xxx.settings       0ms       0ms      0ms
       xxx.severity       0ms       0ms      0ms
     xxx.core_baseStation       0ms       0ms      0ms
 xxx.core_network_element       0ms       0ms      0ms
              xxx.core_ue       0ms       0ms      0ms

                         ns    total     read    write    2023-07-12T15:14:16+08:00
                xxx.alarm    888ms    888ms      0ms
xxx.action_history    739ms    739ms      0ms
             local.oplog.rs      1ms      1ms      0ms
        xxx.history      0ms      0ms      0ms
      xxx.knowledge      0ms      0ms      0ms
       xxx.settings      0ms      0ms      0ms
       xxx.severity      0ms      0ms      0ms
     xxx.core_baseStation      0ms      0ms      0ms
 xxx.core_network_element      0ms      0ms      0ms
              xxx.core_ue      0ms      0ms      0ms

                         ns     total      read    write    2023-07-12T15:14:17+08:00
xxx.device_action_history    1117ms    1117ms      0ms
                xxx.alarm    1039ms    1039ms      0ms
             local.oplog.rs       2ms       2ms      0ms
        xxx.history       0ms       0ms      0ms
      xxx.knowledge       0ms       0ms      0ms
       xxx.settings       0ms       0ms      0ms
       xxx.severity       0ms       0ms      0ms
     xxx.core_baseStation       0ms       0ms      0ms
 xxx.core_network_element       0ms       0ms      0ms
              xxx.core_ue       0ms       0ms      0ms

        上面的示例中,mongotop 工具输出了每个集合的总时间、读时间和写时间。可以根据这些数据来判断每个集合的读写比例和 CPU 占用情况,从而进行性能优化。

3.慢日志分析和优化

mongo可以通过慢查询日志作为性能优化的主要切入点

3.1.开启慢日志

通过命令db.getProfilingLevel()查看profiling开启状态:

  • 0代表关闭
  • 1代表记录慢命令,
  • 2代表全部

3.1.1.通过命令开启

1.db.setProfilingLevel(level),

参数表示慢查询日志开关(设置profiling等级),level等级值0,1,2

        0:表示关闭慢查询日志,

        1:表示开启慢查询日志,

        2:表示记录所有数据库中的查询

当level为1的时候,慢查询的阈值默认值为100ms

2.db.setProfilingLevel(level,slowms)

第一个参数:同上,表示慢查询日志开关

第二个参数:慢查询的阈值,该参数定义了执行时间超过该值的查询被认为是慢查询

可以通过如db.setProfilingLevel(1,50),慢日志就设置为50ms的阈值

3.1.2.通过配置文件开启

systemLog:
    destination: file
    path: "/data/mongodb/logs/mongod.log" #慢日志存放目录
logAppend: true 

operationProfiling:
   slowOpThresholdMs: 100  # 100ms
   mode: slowOp

slowOpThresholdMs 参数:慢查询的阈值

mode: slowOp 选项指定了操作分析的模式为"慢查询模式"

3.1.3.启动命令配置

mongod --profile=1 --slowms=200

3.2.慢日志查看

通过db.system.profile.find()查看当前的监控日志。

> db.system.profile.find({millis:{$gt:500}})
{"ts":ISODate("2011-07-23T02:50:13.941Z"),"info":"query order.order reslen:11022 nscanned:672230  \nquery: { status: 1.0 } nreturned:101 bytes:11006 640ms","millis":640}
{"ts":ISODate("2011-07-23T02:51:00.096Z"),"info":"query order.order reslen:11146 nscanned:672302  \nquery: { status: 1.0, user.uid: { $gt: 1663199.0 } }  nreturned:101 bytes:11130 647ms","millis":647}

这里值的含义是:

  • ts:命令执行时间
  • info:命令的内容
  • query:代表查询
  • order.order: 代表查询的库与集合(命名空间)
  • reslen:返回的结果集大小,byte数
  • nscanned:扫描记录数量
  • nquery:后面是查询条件
  • nreturned:返回记录数及用时
  • millis:所花时间

如果发现:时间比较长,那么就需要作优化。

  • nscanned数很大,或者接近记录总数,那么可能没有用到索引查询
  • reslen很大,有可能返回没必要的字段
  • nreturned很大,那么有可能查询的时候没有加限制,加分页限制

日常使用的慢日志(system.profile)查询命令

# 删除慢日志集合
db.system.profile.drop()

日常使用的慢日志(system.profile)查询

#返回最近的10条记录
db.system.profile.find().limit(10).sort({ ts : -1 }).pretty()

#返回所有的操作,除command类型的
db.system.profile.find( { op: { $ne : ‘command‘ } }).pretty()

#返回特定集合
db.system.profile.find( { ns : ‘mydb.test‘ } ).pretty()

#返回大于5毫秒慢的操作
db.system.profile.find({ millis : { $gt : 5 } } ).pretty()

4.使用mtools分析MongoDB日志文件

mtools是一组用来解析和过滤MongoDB日志文件的脚本。

mtools包括以下几个工具:
  mlogfilter    可以根据时间切割日志文件,过滤慢查询等
  mloginfo      返回日志文件信息,比如开始和结束时间等
  mplotqueries   对日志文件进行视图展现,支持将日志分析结果转换为图表形式,
                依赖于tkinter(python图形模块)、和matplotlib模块。
  mlogvis      创建一个自定义html文件交互式展现
  mlaunch      快速搭建本地测试环境,包括复制集合分片系统

4.1.mtools的安装

需要安装Python 2.7.x或3.6.x才能使用mtools。目前不支持其他版本的Python

在线安装

pip install mtools

源码安装

git clone git://github.com/rueckstiess/mtools.git
cd mtools
python setup.py install

或者pypi官网下载离线包
https://pypi.org/project/mtools/#files

4.2.mloginfo

mloginfo 是一个用于做日志信息统计的工具

总体信息
mloginfo mongo.log

连接数
mloginfo mongo.log --connections

统计出当前某些事件的发生频次。
mloginfo mongo.log --distinct

慢查询
mloginfo mongo.log --queries --sort count

重启信息
mloginfo mongo.log --restart

副本集切换
mloginfo mongo.log --rsstate

4.3.mlogfilter

mlogfilter是一个强大的日志过滤模块,相比linux 的grep/egrep的文本过滤,该组件可以对日志内容进行解析,并按我们想要的结果进行过滤。

查看超过10s的慢操作
mlogfilter mongo.log --slow 10000 --shorten 200

查看慢扫描操作
慢扫描是指该操作需要扫描过多的记录(超过1w行),且返回数量不足扫描数量的1/100,这样的操作通常对CPU消耗很高,也比较低效,
mlogfilter mongo.log --scan --shorten 200

根据集合名称过滤
mlogfilter mongo.log --namespace dmspace.DeviceInfo

根据操作类型过滤
mlogfilter mongo.log --op query
操作类型如下:
    query:查询操作
    command:命令操作(如 findAndModify、createIndexes 等)
    getmore:获取更多数据操作
    insert:插入操作
    update:更新操作
    remove:删除操作


获取某时间点之后1小时的日志
mlogfilter mongo.log --from Apr 6 0:00 --to "+1h" | tail -n3

时区转换
mlogfilter mongo.log --tiemzone 2 > mongo-correct.log

还有mplotqueries:基于tkinter实现的图表组件,可以将日志中扁平的文字信息转换为图表形式。

还有mlogvis:如果不希望生成那么多的图表,mtools还提供了一个偷懒的工具 mlogvis。可以直接生成html页面,内置强大的脚本.基本上覆盖了mplotqueries的绝大多数图表功能。

你可能感兴趣的:(数据库,mongodb,性能优化)