mongodb 调优记录

831 阅读2分钟

mongostat工具,会定时输出当前mongodb的运行状态

mongostat -h x.x.x.x:27017 -u root -p123456
-h:指定IP地址和端口可以使用--port来指定端口号
-u:如果开启了认证,则需要在后面填写用户名
-p:密码

输出样例:

image.png

重要字段解释及关注:

  • insert:每秒插入数据库的对象数量。如果是slave,数值前面有*则表示复制集操作
  • query:每秒查询操作的次数
  • update:每秒更新操作的次数
  • delete:每秒删除操作的次数
  • getmore:每秒查询cursor(游标)时的getmore操作数
  • dirty:脏数据字节的缓存百分比(仅针对WiredTiger引擎)
  • used:正在使用的缓存百分比(仅针对WiredTiger引擎)
  • flushes:(仅针对WiredTiger引擎)指checkpoint的触发次数在一个轮询间隔期.一般都是0,间接性是1.flush开销很大,如果频繁flush则会有问题
  • vsize:虚拟内存使用量
  • res:物理内存使用量
  • arw:执行读写操作的活跃客户端数量
  • qrw:客户端从mongodb实例读写数据的队列长度
  • net_in:mongo实例的网络进流量
  • net_out:mongo实例的网络出流量
  • conn:打开的总连接数 建议5000以下

查看日志:

先从mongod.conf文件中找到logpath的定义.再在对应的路径查看日志文件

设置日志级别:

db.setLogLevel(<level>, <component>)
level int
 0 is the mongodb default log level 
-1 all level 
 1 to 5 include debug message

开启慢请求:

db.setProfilingLevel(级别)
- 0 不开启
- 1 记录慢sql(默认>100ms) 
- 2记录所有命令
db.setProfilingLevel(1,10)
表示开启慢查询,记录超过10ms的语句

查看慢查询:

db.system.profile.find({}}); 查看所有
db.system.profile.find({millis:{$gt:5}});查询大于5ms的记录
db.system.profile.find().sort({$natrual: -1}).limit(3);按插入顺序倒序,显示最近3条
db.system.profile.find().sort({$natural:-1}).limit(1);查看最近的一条记录
 { "ts" : ISODate("2012-05-20T16:50:36.321Z"), "info" : "query test.system.profile reslen:1219
nscanned:8  \nquery: { query: {}, orderby: { $natural: -1.0 } }  nreturned:8 bytes:1203", "millis" :
0 }
-ts:时间戳
-info:具体操作
-millis:耗时,毫秒

分析mongodb正在执行的请求:

db.currentOp();

{
        "desc" : "conn632530",
        "threadId" : "140298196924160",
        "connectionId" : 632530,
        "client" : "11.192.159.236:57052",
        "active" : true,
        "opid" : 1008837885,
        "secs_running" : 0,
        "microsecs_running" : NumberLong(70),
        "op" : "update",
        "ns" : "mygame.players",
        "query" : {
            "uid" : NumberLong(31577677)
        },
        "numYields" : 0,
        "locks" : {
            "Global" : "w",
            "Database" : "w",
            "Collection" : "w"
        },
        ....
}

重要关注点

字段含义
client该请求是由哪个客户端发起的。
opid操作的唯一标识符。
secs_running表示该操作已经执行的时间,单位为秒。如果该字段返回的值特别大,需要查看请求是否合理。
microsecs_running表示该操作已经执行的时间,单位为微秒。如果该字段返回的值特别大,需要查看请求是否合理。
ns该操作目标集合。
op表示操作的类型。通常是查询、插入、更新、删除中的一种。
locks跟锁相关的信息