1:想知道哪些操作拖慢了MongoDB的速度,首先需要检查当前正在执行哪些操作。

gechongrepl:PRIMARY> db.currentOp()
"opid" : 78891,#操作的唯一标识符,可通过它来终止操作
"active" : true,#true表示当前正在运行,false表示此操作已交出或在等待其他操作交出锁
"secs_running" : 1,#查看执行时间,可以通过该参数定位耗时的操作
"microsecs_running" : NumberLong(1081719),#
"op" : "getmore",#操作的类型,有查询、插入、更新、删除。数据库命令当查询处理
"ns" : "local.oplog.rs",
"query" : { },
"client" : "192.168.91.132:55738",
"desc" : "conn1534",#可与日志信息联系起来,可以用来筛选相关的日志信息。
"threadId" : "0x7f91d77a5700",
"connectionId" : 1534,
"waitingForLock" : false,#表示该操作是否因正在等待其他操作交出锁而处于阻塞状态。
"numYields" : 0,#表示该操作交出锁,而使其他操作得以运行
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(68),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {#表示该操作需要多长时间才能取得所需的锁
"r" : NumberLong(7),
"w" : NumberLong(0)
}
}

  

条件查询

gechongrepl:PRIMARY> db.currentOp({"ns":"local.oplog.rs"})
这里只是举个例子:通常不会终止ns:local.oplog.rs的,因为复制的线程会持续的向同步源请求更多的操作。如果被异常终止,MongoDB会重启他们,但是会短暂的中断复制。

  

如果发现特别耗时的查询可以终止操作

gechongrepl:PRIMARY> db.killOp(5299)
update和find和remove操作可以被终止。因为他们已经交出了锁。正在占用锁或者等待其他操作交出锁的操作则无法被终止

怪异现象:终止了一个批量插入的语句,最后发现还是插入完成了。因为批量插入操作请求之后会写在缓冲区中的。即使终止了客户端发送请求,MongoDB还会处理缓冲区的写入操作。如果需要解决这种现象最好的方式是使用应答式写入,即每次写入操作都会等待上一次写入操作完成后才会进行下去。

2:打开系统分析器

查看当前的分析器级别:

gechongrepl:PRIMARY> db.getProfilingLevel()

  

gechongrepl:PRIMARY> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
db.system.profile.find().pretty()

把级别设置为2意味着分析器会记录所有内容。数据库的所有读写请求都会写到system.profile中。这样会造成性能的损失,因为每一次写操作都会增加额外的写入时间,而每一次读操作都要等待写锁(因为它必须在system.profile集合中写入记录)

gechongrepl:PRIMARY> db.setProfilingLevel(1,100)
{ "was" : 2, "slowms" : 100, "ok" : 1 }
db.system.profile.find().pretty()

级别1分析器会默认记录耗时大于100ms的操作。可以自定义阀值

gechongrepl:PRIMARY> db.setProfilingLevel(1,500)
{ "was" : 1, "slowms" : 100, "ok" : 1 } db.system.profile.find().pretty()

  

gechongrepl:PRIMARY> db.setProfilingLevel(0)
{ "was" : 1, "slowms" : 500, "ok" : 1 }

0就是关闭分析器 

3:计算MongoDB的空间消耗

_id存储为ObjectId类型,比存储为字符串类型效率更高

gechongrepl:PRIMARY> Object.bsonsize({_id:ObjectId()})
22
gechongrepl:PRIMARY> Object.bsonsize({_id:""+ObjectId()})
39
也可以直接对集合中的文档进行查询:
gechongrepl:PRIMARY> Object.bsonsize(db.users.findOne())
0

  

查看集合大小

gechongrepl:PRIMARY> db.test.stats()
{
"ns" : "test.test",
"count" : 239000,
"size" : 19728112,
"avgObjSize" : 82,
"storageSize" : 37797888,
"numExtents" : 8,
"nindexes" : 1,
"lastExtentSize" : 15290368,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 7456512,
"indexSizes" : {
"_id_" : 7456512
},
"ok" : 1
}
gechongrepl:PRIMARY>

  

以MB为单位显示

gechongrepl:PRIMARY> db.test.stats(1024*1024)
{
"ns" : "test.test",
"count" : 239000,
"size" : 18,
"avgObjSize" : 82,
"storageSize" : 36,
"numExtents" : 8,
"nindexes" : 1,
"lastExtentSize" : 14,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 7,
"indexSizes" : {
"_id_" : 7
},
"ok" : 1
}

  

数据库大小:

gechongrepl:PRIMARY> db.stats()
{
"db" : "test",
"collections" : 6,
"objects" : 239035,
"avgObjSize" : 82.56948145669044,
"dataSize" : 19736996,
"storageSize" : 38879232,
"numExtents" : 13,
"indexes" : 3,
"indexSize" : 7472864,
"fileSize" : 67108864,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
},
"ok" : 1
}

  

4:使用mongostat和mongotop查看

  

MongoDB副本集配置系列六:定位MongoDB慢的原因的更多相关文章

  1. MongoDB副本集配置系列十一:MongoDB 数据同步原理和自动故障转移的原理

    1:数据同步的原理: 当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步: 1:检查自己local库的oplog.rs集合找出最近的时间戳. 2:检查Primary ...

  2. MongoDB副本集配置系列九:MongoDB 常见问题

    What is a namespace in MongoDB? If you remove a document, does MongoDB remove it from disk? When doe ...

  3. MongoDB副本集配置系列十:MongoDB local库详解和数据同步原理

    1:local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息 gechongrepl:PRIMARY> use local switched to db local gechong ...

  4. MongoDB副本集配置系列七:MongoDB oplog详解

    1:oplog简介 oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的.每个节点都有oplog,记录这从主节点复制过来的信息,这样 ...

  5. MongoDB副本集配置系列八:MongoDB监控

    1:Mongostat MongoDB2.6版本 MongoDB3.0版本 2:db.setProfilingLevel(2):打开profiler 类似于MySQL的slow log Profile ...

  6. MongoDB副本集配置系列五:副本集的在线迁移

    MongoDB副本集的在线迁移 查看当前集群的状态: { "setName" : "gechongrepl", "setVersion" : ...

  7. MongoDB副本集配置系列三:副本集的认证方式

    1:副本集配置参考这篇博客: http://www.cnblogs.com/xiaoit/p/4478951.html 2:副本集的认证 假设有两台机器已经配置好了副本集(副本集罪一般最少3台机器,这 ...

  8. MongoDB副本集配置系列二:配置MongoDB副本集

    接上一篇博客: http://www.cnblogs.com/xiaoit/p/4479066.html 1:首先创建3台虚拟机作为配置环境 IP1:192.168.91.128 IP2:192.16 ...

  9. MongoDB副本集配置系列一:安装MongoDB

    1:下载MongoDB 2.6版本 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-2.6.9.zip 2:解压 tar ...

随机推荐

  1. 3种LVS/Nginx/HAProxy负载均衡器的对比分析

    现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术: 一种是通过硬件来进 行进行,常见的硬件有比较昂贵的NetScaler.F5.Radware和Array等商用 ...

  2. SharePoint 列表视图修改多行文本字段显示长度

    前言 最近有这么个需求,用户希望在所有项目视图显示多行文本字段,然后,又不希望显示的过场,也就是处理一下长度. 一开始就想到用js的方式去处理,偶然间发现还可以用jslink,尝试了一下,非常好用,分 ...

  3. Eclipse启动时提示fail to create the Java Virtual Machine问题的解决办法

    是eclipse.ini文件的问题,打开eclipse安装目录下的eclipse.ini文件: 将其中的256m改为128m,512m改为256m,1024m改为512m即可 修改后如下: -star ...

  4. [Hook] 免root,自己进程内,binder hook (ClipboardManager)

    cp from : http://weishu.me/2016/02/16/understand-plugin-framework-binder-hook/ Android系统通过Binder机制给应 ...

  5. SIFT(Scale-invariant feature transform) & HOG(histogram of oriented gradients)

    SIFT :scale invariant feature transform HOG:histogram of oriented gradients 这两种方法都是基于图像中梯度的方向直方图的特征提 ...

  6. Chart:ECharts

    ylbtech-Chart:ECharts ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome, ...

  7. IIS7.5中调试.Net 4.0网站出现无厘头500错误的解决办法 (转)

    刚刚 部署了ii7的dll的有x86写的,就会出现以下这样的问题 iis 7 x86,Could not load file or assembly 'Name' or one of its depe ...

  8. java 反射机制--根据属性名获取属性值

    1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ priv ...

  9. java正则校验,密码必须由字母和数字组成

    一个匹配数字和字母密码的正则表达式 2011 年 12 月 14 日 | Filed under: 正则表达式 and tagged with: 密码 , 正则表达式 , 零宽断言 一个用户注册功能的 ...

  10. [Math]理解卡尔曼滤波器 (Understanding Kalman Filter) zz

    1. 卡尔曼滤波器介绍 卡尔曼滤波器的介绍, 见 Wiki 这篇文章主要是翻译了 Understanding the Basis of the Kalman Filter Via a Simple a ...