MongoDB性能问题排查
mongostat
间隔固定时间(每秒)输出mongodb的当前运行状态。
./bin/mongostat --port [port] -u qingteng -p [password] --authenticationDatabase admin

输出字段说明:
| 字段名称 | 说明 | 
| insert | 每秒插入次数 | 
| query | 每秒查询次数 | 
| update | 每秒更新次数 | 
| delete | 每秒删除次数 | 
| getmore | 每秒执行getmore次数 | 
| command | 每秒的命令数,除了插入、查找、更新、删除命令统计外,还统计了别的命令 | 
| dirty | 脏数据字节的缓存百分比(超过20%时阻塞新请求) | 
| used | 正在使用的缓存百分比(超过95%时阻塞新请求) | 
| flushes | 对于WiredTiger引擎来说,是指checkpoint的触发次数在一个轮询间隔期间 对于MMAPv1 引擎来说,是指每秒执行fsync将数据写入硬盘的次数 一般flushes都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。 flush开销是很大的,如果频繁的flush,就需要排查一下原因了 | 
| mapped | 所有的被mmap的数据量 | 
| vsize | 虚拟内存使用量(在mongostat最后一次调用的总数据) | 
| res | 物理内存使用量(在mongostat最后一次调用的总数据) vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,就需要排查一下是否存在其他的程序正在消费内存 | 
| faults | 每秒访问失败数,与内存swap有关 | 
| qrw | 客户端读写等待队列数量,高并发时,一般队列值会升高 | 
| arw | 客户端读写活跃个数 | 
| net_in | 网络带宽压力,MongoDB实例的网络进流量 | 
| net_out | 网络带宽压力,MongoDB实例的网络出流量 | 
| conn | 打开连接的总数,是qr,qw,ar,aw的总和 MongoDB为每一个连接创建一个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接数的启动参数maxIncomingConnections | 
| time | 时间戳 | 
mongotop
输出每个集合压力状态
间隔固定时间(每秒,若需要每3秒,可以在命令最后空格 3 即可)输出mongodb的当前每个集合的读写耗时。
./bin/mongotop --port [port] -u qingteng -p [password] --authenticationDatabase admin

输出字段说明:
| 字段名称 | 说明 | 
|---|---|
| ns | 集合名称 | 
| total | 读写花费时间(ms) | 
| read | 读花费时间 | 
| write | 写花费时间 | 
查看慢查询日志
mongodb可以通过profile功能来监控数据。
查看当前设置
查看当前是否开启profile功能:
db.getProfilingLevel();
说明:
- 0:表示关闭,不收集任何慢查询(默认)
- 1:表示收集慢查询数据,默认收集超过100ms的慢查询
- 2:表示收集任何操作记录
查看当前profile状态:
db.getProfilingStatus();
说明:
- was:当前是否开启慢查询,数值含义跟上面的对应
- slowms:超过多少ms才收集
修改当前设置
开启慢查询日志,并设置slowms为50ms:
db.setProfilingLevel(1,50);
查看慢查询日志
按耗时倒序排序,查看前3个最慢的操作:
db.system.profile.find().limit(3).sort( { ts : -1 } ).pretty();
说明:最后的pretty()只是为了打印好看些~
    知识改变世界
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号