`
smm11230704
  • 浏览: 87886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MongoDB 性能瓶颈分析

阅读更多
一、前情简介

半个月前,公司的MongoDB压力由于用户量暴增导致压力急剧增加,读写能力下降。
因为对于Mongos 的集群分片机制的了解和测试还不是很充分,所以开始使用最简单的办法来解决:提高配置。
众所周知,MongoDB是出了名的吃内存。当时定义出来提高MongoDB的办法很简单,插内存。
但是由于机房问题,插内存需要拔电源,导致停止产品的服务,所以经过研究后。
用我们备用的R710 64GB内存服务器来替代线上的R410 32GB内存的服务器。

二、操作方式

(1)首先是确认防火墙,端口是否开放,MongoDB1.82升级2.02安装成功,所有操作在内网进行。
(2)使用Rsync将R410服务器的MongoDB主库数据同步到R710中。
同步结束之后,删除R710本地Local文件。以从库模式启动,开始同步R410中MongoDB主库的数据。
在同步延时在1s左右。确认数据及时同步。
(3)在确认数据同步后,切断所有数据库Write操作的入口。使MongoDB主库的数据不再出现变动。
这之后确认从库的数据已经与主库完全同步。进入主库,shutDownServer()。停止主库服务。
然后进入从库,shutDownServer。停止从库服务。
然后再将R710中的从库以主库的模式重新启动。这时同时切换所有访问数据库程序的Hosts。使其从R410的主机IP指向到R710的主机IP。这时启动所有服务。

三、启动后的惊心动魄

启动服务之后,MongoDB并没有像我们想象中的疯狂的占用内存,起初只是占用了2.5G左右的内存。
用户在频繁的访问数据库,通过MongoStat观察到。用户的QR和QW也就是读写队列不停堆积。Locked值居高不下。
明显是处理不过来。创建的conn连接数越来越多,导致客户端频繁的出发TimeOut。
最后甚至引起了MongoDB锁死,不再执行任何操作。写入队列堆积到20000+。
之后进行查询,网上说MongoDB2.02 + R710需要在启动参数中追加numactl --interleave=all 。
经过添加后,松了一口气,因为无效。
之后的几天频繁出现问题,MongoDB占用内存最高只打到5GB的热点数据。
在昨天中午数据库彻底锁死宕机。
问题被定位在R710的硬件设备不兼容上。
被迫在白天的时候重新操作了一次之前的工作,将数据库迁移回R410。
在晚上的时候进行观测,发现数据依然不够理想。还是一样的效果。
之后开始怀疑是因为MongoDB1.82升级到2.02导致的问题,开始查阅资料。但是依然毫无进展。

四、一些性能优化

之后进行Nginx和MongoDB的log观察。发现每分钟大概14000的动态请求。而MongoDB的log一直在展示一些可怕的慢查询,最长的一次竟然有370秒!
MonogoDB有个很坑爹的地方就Auth验证,我之前的日志还描述过这个东西,但是没想到每次创建连接时的密码验证竟然成了瓶颈所在。希望大家慎用。可以选择封闭MongoDB所在主机的外网IP,然后使用内网无密码访问最佳。
之后进行服务器性能优化,在频繁调用的几个接口紧急使用缓存来缓解问题。而一些不重要不需要及时更新的查询则切换到从库进行查询。并切掉了一些需要及时更新的数据接口也访问从库,需要mark下数据库缓解后再调整回去。
经过追查每一个表的索引发现,数据表中有很多冗余索引,有一些没有作为索引条件查询,有一些已经被建为联合索引,却依然没有删除掉。果断Drop掉这些Index。
这之后数据的读写队列在300-1000左右,依然是不健康的状态。

五、再一次定位问题

这之后MongoDB一直在不健康的状态但是并没有再一次宕机。不过危险依然存在。
MongoDB的占用的内存热点数据依然是5GB左右。崩溃了。
定位问题到MongoDB的数据由于不在内存中,所以导致读写速度障碍。
写了一段Java程序进行R710数据库数据循环插入,希望能测试出是否可以提高内存占用量。
果然,结果是插入一段时间之后。MongoDB的内存占用已经到达36GB。理想中的结果。
不过线上环境不能随便插入数据,所以使用python写了一段全表扫描数据的脚本执行。
结果竟然无效。
推论是插入会直接放入热点中,查询可能是需要经历一段时间和几次的命中才会。坑爹。
目前能做的就是等待,等待MongoDB的热点内存占用提高,才能缓解所有问题。直到Mongos测试OK

六、其实。。最重要的地方在这里

问题主因就是优化不足,还轻率的进行了数据库切换。
MongoDB在R410时候运行,所有的热点数据在内存映射Mapping。而R710没有,需要再规则下重新进行映射。
最坑爹的就是这里。这段时间需要很久。而数据库重启导致用户重连服务,暴起的连接数和请求数直接压垮数据库。
甚至会导致数据库启动就宕机的危险。

七、动作要谨慎。Over
分享到:
评论
2 楼 chary8088 2016-03-25  
不错,不错
1 楼 ericcoderr 2013-01-31  
你好,我在linux(16核,32位)系统下安装了mongodb2.2.2,发现当内存使用到30g左右时,如果重启mongodb,这时有请求进来时,linux负载就会持续上升,看io和cpu使用激活100%空闲,是什么原因?

相关推荐

    MongoDB性能调优(基于MMS)

    在基于MongoDB的Ops Manager(MMS)上进行性能调优,能够让用户通过一系列监控指标分析出MongoDB性能问题的根本原因,并据此进行相应的优化。 在进行性能调优时,我们首先需要定义用于指导性能调查的关键指标,随后...

    MongoDB 性能最佳实践

    - **使用 mongostat/mongotop**:监控 MongoDB 的实时性能,发现潜在瓶颈。 - **分析工具**:`db.collection.explain()` 分析查询性能,`db.runCommand({profile: 2})` 开启查询日志,分析慢查询。 - **定期维护*...

    MongoDB北京2014 - MongoDB性能扩展 - 唐建法

    **背景**:磁盘I/O通常是性能瓶颈之一,特别是在大数据量和高并发场景下。 **措施**: - 选择高性能的存储设备,如SSD固态硬盘,以减少I/O延迟。 - 对频繁访问的数据进行分区,减少不必要的磁盘读写操作。 - 优化...

    mongodb性能优化.pptx

    ### MongoDB性能优化详解 #### 一、MongoDB性能优化概述 MongoDB作为一种广泛使用的NoSQL数据库,因其灵活性和高扩展性而备受青睐。然而,在实际应用过程中,由于数据量的增长和查询复杂性的增加,可能会遇到性能...

    mongodb性能监控

    之后,可以通过 `db.system.profile.find()` 查看 profile 日志,分析数据库的性能瓶颈。 在日志中,`ts` 表示命令执行时间,`info` 包含命令详情,`query` 显示查询内容,`order.order` 指查询的数据库和集合,`...

    MongoDB查询性能验证及优化

    例如,`mongotop`和`mongostat`命令行工具可以实时监控数据库的读写操作、内存使用和磁盘I/O,帮助识别性能瓶颈。另外,MongoDB的Profiler功能可以记录所有查询的执行时间,便于分析慢查询。 在"mongoDB调研_remote...

    MongoDB在性能监控领域的应用 熊掀

    通过实时监控这些指标,可以帮助数据库管理员及时发现性能瓶颈和异常问题,采取相应的优化措施。 在数据存储方面,MongoDB具有无固定结构的JSON/KV格式,这使得它非常适合存储交易数据、告警数据和统计数据。由于其...

    MongoDB性能优化

    2. 日志分析:定期检查日志文件,找出可能导致性能瓶颈的问题,如长时间的查询、锁等待等。 3. 定期维护:执行`db.repairDatabase()`进行数据库修复,以及定期清理不活动的集合和碎片,保持数据库健康。 综上所述...

    mongodb查询性能.rar

    5. **监控与分析**:使用`db.serverStatus()`和`db.stats()`等命令监控MongoDB的运行状态,定期检查慢查询日志,找出性能瓶颈。 6. **硬件配置**:适当增加硬件资源,如增加内存、使用更快的硬盘或采用SSD,都可以...

    NoSQL(SequoiaDB&Cassandra&MongoDB)Benchmark性能对比测试报告

    在测试的设置过程中,bankmarkUG团队尽可能使用了所有系统的预设配置,仅对可能导致性能瓶颈的关键参数进行了调整。官方文档和其他公开可用的资料被充分利用来对所有数据库进行配置,同时报告中记录了所有重大的配置...

    MongoDB流量-流量分析

    5. **性能瓶颈识别**:通过流量分析,可以识别数据库的性能瓶颈,如CPU、内存、磁盘I/O等。例如,频繁的磁盘寻道可能表明需要增加缓存或优化索引;高CPU使用率可能提示查询优化不足。 6. **强化学习应用**:强化...

    MongoDB性能优化及监控

    MongoDB性能优化与监控是确保MongoDB高效运行的关键环节,对于大数据量和高并发的应用场景尤其重要。MongoDB作为一个分布式文件存储的数据库,其优化策略包括但不限于索引管理、执行计划分析以及监控等方面。 **一...

    MongoDB的执行计划分析与巡检分享.pdf

    根据提供的文档信息,我们可以归纳和展开关于MongoDB执行计划分析与巡检的相关知识点。 ### MongoDB执行计划分析 #### 一、执行计划概述 在MongoDB中,查询优化器负责选择最佳的方法来执行查询操作,这一过程称为...

    Python-mtools一组脚本用于设置MongoDB测试环境并分析和可视化MongoDB日志文件

    通过`logparser`,用户可以轻松定位性能瓶颈,比如慢查询、高CPU使用率或者内存压力等问题。 **三、日志可视化** 日志分析的结果通常以文本形式呈现,对于大量数据,理解和解析可能相当困难。`mtools` 的另一大...

    MongoDB_two_MongoDB_

    11. 性能调优:包括监控工具的使用、日志分析、性能瓶颈识别,以及如何通过调整参数来提高MongoDB的性能。 在学习MongoDB的过程中,理解其设计理念——为大数据和实时应用提供灵活且高性能的解决方案,是非常重要的...

Global site tag (gtag.js) - Google Analytics