目录
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,我们需要对其性能进行监控,以便及时发现潜在的问题,提升系统的稳定性和可靠性。
用于监控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:表示当前连接数
每秒分析排名前十的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 占用情况,从而进行性能优化。
mongo可以通过慢查询日志作为性能优化的主要切入点
通过命令db.getProfilingLevel()
查看profiling开启状态:
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的阈值
systemLog:
destination: file
path: "/data/mongodb/logs/mongod.log" #慢日志存放目录
logAppend: true
operationProfiling:
slowOpThresholdMs: 100 # 100ms
mode: slowOp
slowOpThresholdMs
参数:慢查询的阈值
mode: slowOp
选项指定了操作分析的模式为"慢查询模式"
mongod --profile=1 --slowms=200
通过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()
mtools是一组用来解析和过滤MongoDB日志文件的脚本。
mtools包括以下几个工具:
mlogfilter 可以根据时间切割日志文件,过滤慢查询等
mloginfo 返回日志文件信息,比如开始和结束时间等
mplotqueries 对日志文件进行视图展现,支持将日志分析结果转换为图表形式,
依赖于tkinter(python图形模块)、和matplotlib模块。
mlogvis 创建一个自定义html文件交互式展现
mlaunch 快速搭建本地测试环境,包括复制集合分片系统
需要安装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
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
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的绝大多数图表功能。