一,mongoStat
mongoStat从MongoDB 4.4开始已经不会随着mongoDB的安装程序一起下载了,要单独从下载中心下载
比较重要的参数:
dirty:脏数据的百分比,当值超过20%时,mongodb会阻塞新请求,全力将脏数据回写到文件中
used:缓存使用率,当超过80%试,会根据lru算法,清除部分缓存,当超过95%时,mongodb会阻塞新请求来清理缓存
更多参数及使用介绍
实验:
当尝试一个进程通过for循环写入100w条数据
for (i=0;i<1000000;i++){
db.product.insertOne(
{
"id":"product-id-"+i,
"name":"product-name-"+i,
"price":123,
"detail":"<html><body>hello world</body></html>",
"sku":[
{
"id":"product-id-"+i+"-sku-"+i,
"inventory":123
}
],
"createAt":new Date(),
"updateAt":new Date(),
"tag":[
"red",
"black"
]
})
}
开始dirty会不停的增大,在某个时间点的时候,到达写盘的触发点,会将脏数据写盘,除非有大量的并发客户端不停的写,一般很难达到20%
二,mongoTop
mongoTop可以查看当前是哪个集合耗时会比较多,在写100w条数据时执行,可以看见alex.product这个集合下面耗时最多
//10秒统计一次
./mongoTop 10
三,慢查询日志
通过log目录下面的log,执行
cat mongo.log |grep Slow
可以得到慢查询的记录,其中一条记录通过json格式化后,大部分字段和explain中的字段类似:
{
"t":{
"$date":"2021-01-12T23:40:59.775+08:00"
},
"s":"I",
"c":"COMMAND",
"id":51803,
"ctx":"conn4",
"msg":"Slow query",
"attr":{
"type":"command",
"ns":"alex.product",
"appName":"MongoDB Shell",
"command":{
"find":"product",
"filter":{
"id":"product-id-10000"
},
"lsid":{
"id":{
"$uuid":"c8556c9b-8212-49be-babb-81e5ab901cfd"
}
},
"$db":"alex"
},
"planSummary":"COLLSCAN",
"keysExamined":0,
"docsExamined":1000000,
"cursorExhausted":true,
"numYields":1000,
"nreturned":1,
"queryHash":"6DAB46EC",
"planCacheKey":"6DAB46EC",
"reslen":387,
"locks":{
"ReplicationStateTransition":{
"acquireCount":{
"w":1001
}
},
"Global":{
"acquireCount":{
"r":1001
}
},
"Database":{
"acquireCount":{
"r":1001
}
},
"Collection":{
"acquireCount":{
"r":1001
}
},
"Mutex":{
"acquireCount":{
"r":1
}
}
},
"storage":{
"data":{
"bytesRead":78161965,
"timeReadingMicros":19485
}
},
"protocol":"op_msg",
"durationMillis":339
}
}
有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。 启动MongoDB时加上–profile=级别 即可。 也可以在客户端调用 db.setProfilingLevel(级别) 命令来实时配置
profile的级别可以取0,1,2 三个值,他们表示的意义如下:
0 – 不开启
1 – 记录慢命令 (默认为>100ms)
2 – 记录所有命令
那么这个慢的定义是什么?上面我们说到其默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添加–slowms 启动参数配置。第二种是调用db.setProfilingLevel时加上第二个参数:
//改成超过10ms为慢查询
db.setProfilingLevel( 1 , 10 );