mongodb跟踪SQL语句及慢查询收集
原创转自: http://blog.163.com/ji_1006/blog/static/1061234120134633710740/ 另一个参考: http://blog.zol.com.cn/3044/article_3043984.html
有一个要求:跟踪mongodb的SQL语句和慢速查询收集
第 1 步:通过mongodb内置函数可以在一段时间内查看DML运行语句的次数。
在bin在目录下运行 ./mongostat -port 端口号 您可以看到以下数据
其输出包含以下列:
- inserts/s 每秒插入次数
- query/s 每秒查询数
- update/s 每秒更新次数
- delete/s 每秒删除数
- getmore/s 每秒执行getmore次数
- command/s 每秒的命令数高于上面提到的插入、搜索、更新和删除的总次数,其他命令也被计算在内
- flushs/s 每秒执行fsync数据写入硬盘的次数。
- mapped/s 所有的被mmap数据量,单位为MB,
- vsize 虚拟内存使用情况,单位MB
- res 物理内存使用情况(单位)MB
- faults/s 每秒访问失败次数(仅Linux是的,数据已从物理内存中交换出来并放置在swap。不要超过100否则,机器内存太小,导致频繁错误swap写进去。此时,您需要升级内存或扩展内存
- locked % 锁定时间的百分比应尽可能控制在50%以下吧
- idx miss % 索引未命中的百分比。如果它太高,我们需要考虑索引是否更少 了
- q t|r|w 当Mongodb接收到的命令过多,数据库被锁定无法完成,它将对命令进行排队。此列显示总计、读取和写入3每个队列的长度为0的话表示mongo没有压力。当并发性较高时,队列值通常会增加。
- conn 当前连接数
- time 时间 戳
以上内容仅为一般回顾,尚未追踪SQL句。在下面开始慢查询
在mongodb客户端运行
db.getProfilingLevel()
以取0,1,2 三个值表示以下含义:
0 – 不开启
1 – 记录慢速命令 (默认为>100ms)
2 – 记录所有命令
更改此值的方法是:如果更改为2
db.setProfilingLevel(2)
Profile 级别记录1时会记录慢速命令,那么这个慢的定义是什么?上面我们说到其默认为100ms当然,默认设置也有,设置的方法和级别有两种,一种是添加——slowms启动参数配置。第二种方法是调用db.setProfilingLevel在以下情况下添加第二个参数:
db.setProfilingLevel( level , slowms )
db.setProfilingLevel( 1 , 10 );
Mongo Profile 记录直接存储在系统中db在里面,记录位置 system.profile 所以,我们只需要查询这个Collection我们的记录可以从以下网址获得 Profile 记录了。
db.system.profile.find()
{"ts" : "Thu Jan 29 2009 15:19:32 GMT-0500 (EST)" , "info" : "query test.$cmd ntoreturn:1 reslen:66 nscanned:0
query: { profile: 2 } nreturned:1 bytes:50" , "millis" : 0}
db.system.profile.find( { info: /test.foo/ } )
{"ts" : "Thu Jan 29 2009 15:19:40 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0}
{"ts" : "Thu Jan 29 2009 15:19:42 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0}
{"ts" : "Thu Jan 29 2009 15:19:45 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 reslen:102 nscanned:2
query: {} nreturned:2 bytes:86" , "millis" : 0}
查看最新 Profile 记录:
db.system.profile.find().sort({$natural:-1})
Profile 信息内容详细说明: ts-何时执行此命令. millis Time-此命令的执行时间以毫秒为单位. info-此命令的详细信息. query-指示这是一个query查询操作.
ntoreturn-客户端为此查询需要返回的记录数.比如, findOne()命令执行期间 ntoreturn 为 1.有limit(n) 条件时ntoreturn为n. query-特定查询条件(例如x>3). nscanned-此查询中扫描的记录数. reslen-返回结果集的大小. nreturned-此查询返回的实际结果集.
update-指示这是一个update更新操作.
fastmod-Indicates a fast modify operation. See Updates. These operations are normally quite fast. fastmodinsert – indicates a fast modify operation that performed an upsert. upsert-表明update的upsert参数为true.此参数的功能是update如果记录不存在,请使用update的条件insert一条记录. moved-表明本次update硬盘上的数据是否已移动?如果新记录比原始记录短,则通常不会移动当前记录。如果新记录比原始记录长,则记录可能会移动到另一个位置,这可能会导致相关索引的更新.更多的磁盘操作,加上索引更新,可能会使此类操作变慢.
insert-这是一个insert插入操作. getmore-这是一个getmore 操作,getmore通常发生在具有大型结果集的查询中,其中第一个query返回了一些结果,后续结果是通过getmore获得。
如果您只查看query筛选方法如下:
db.system.profile.find({"op":"query"})
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除