下面文章转载自火丁笔记
,原作者描述了一次MongoDB
数据迁移过程中遇到的性能问题及其解决方案,中间追查问题的方法和工具值得我们学习。另外NoSQLFan还对作者略讲的问题产生原理进行了分析,希望对您有用。
下面是其原文:
最近忙着把一个项目从MySQL迁移到MongoDB,在导入旧数据的过程中,遇到了些许波折,犯了不少错误,但同时也学到了不少知识,遂记录下来。
公司为这个项目专门配备了几台高性能务器,清一色的双路四核超线程CPU,外加32G内存,运维人员安装好MongoDB后,就轮到我了,我习惯于在使用新服务器前先看看相关日志,了解一下基本情况,当我浏览MongoDB日志时,发现一些警告信息:
WARNING: You are running on a NUMA machine.
We suggest launching mongod like this to avoid performance problems:
numactl --interleave=all mongod [other options]
当时我并不太清楚NUMA
是什么东西,所以没有处理,只是把问题报告给了运维人员,事实证明运维人员也没有处理,所以问题的序幕就这样拉开了…
迁移工作首先要导入旧数据。开始一切倒还正常,不过几小时之后,我无意中发现不知道什么时候开始数据导入的速度下降了,同时我的PHP脚本开始不停的抛出异常:
cursor timed out (timeout: 30000, time left: 0:0, status: 0)
我一时判断不出问题所在,想想先在PHP脚本里加大Timeout的值应付一下:
MongoCursor::$timeout = -1;
可惜这样并没有解决问题,错误反倒变着花样的出现了:
max number of retries exhausted, couldn't send query
couldn't send query: Broken pipe
无奈之下用strace跟踪了一下PHP脚本:
shell> strace -p <PID>
发现进程卡在了recvfrom操作上:
recvfrom(<FD>,
通过如下命令查询recvfrom操作的含义是:receive a message from a socket
shell> apropos recvfrom
还可以按照下面的方式确认一下:
shell> lsof -p <PID>
shell> ls -l /proc/<PID>/fd/<FD>
此时查询MongoDB当前操作
,发现几乎每个操作会消耗大量的时间:
shell> echo "db.currentOp()" | /path/to/mongo
同时运行mongostat
显示很高的locked值。
…
重复做了很多工作,但始终无法找到问题的症结在哪里,只好求助官方论坛
,那里的技术支持都很热心,在我描述了问题后,没过多久就有了回复,建议我检查一下是不是索引不佳所致,为了验证这种可能,我激活了Profiler
记录慢操作:
mongo> use <DB>
mongo> db.setProfilingLevel(1);
不过结果显示基本都是insert操作(因为我是导入数据为主),本身就不需要索引:
mongo> use <DB>
mongo> db.system.profile.find().sort({$natural:-1})
…
问题到了这里,似乎已经走投无路了,为了死马当活马医,我又重复了几次迁移旧数据的过程,结果自然是次次都出问题,但幸运的是我发现每当出问题的时候,在top命令的结果中,总有一个名叫irqbalance
的进程居高不下,搜索了一下,结果很多介绍irqbalance
的文章中都提及了NUMA
,让我一下子记起之前在日志中看到的警告信息,于是乎按照信息里介绍的,重新启动了一下MongoDB:
shell> numactl --interleave=all /path/to/mongod
一切都正常了。为了解决这个问题,浪费了很多精神,实在没有力气再解释NUMA到底是什么东西了,有想了解的网友可以参考老外的文章
,里面的介绍很翔实。
原文链接:huoding.com
对于罪魁祸首,作者留给大家去学习,NoSQLFan在这里可以给大家做一个简单的描述,先解释几个概念
NUMA
:NUMA是多核
心CPU架构中的一种,其全称为Non-Uniform Memory Access,简单来说就是在多核心CPU中,机器的物理内存是分配给各个核的,架构简图如下所示:
每个核访问分配给自己的内存会比访问分配给其它核的内存要快,有下面几种访问控制策略:
- 1.缺省(default):总是在本地节点分配(分配在当前进程运行的节点上);
- 2.绑定(bind):强制分配到指定节点上;
- 3.交叉(interleave):在所有节点或者指定的节点上交织分配;
- 4.优先(preferred):在指定节点上分配,失败则在其他节点上分配。
上面文章中最后使用numactl –interleave命令就是指定其为交叉共享模式。
irqbalance
:这是作者在上面提到的一个占用CPU的进程,这个进程的作用是在多核心CPU的操作系统中,分配系统中断信号的。参见:irqbalance.org
概念说完了,下面是上面问题的简单描述:
我们知道虚拟内存机制是通过一个中断信号来通知虚拟内存系统进行内存swap的,所以这个irqbalance进程忙,是一个危险信号,在这里是由
于在进行频繁的内存交换。这种频繁交换现象称为swap
insanity,在MySQL中经常提到,也就是在NUMA框架中,采用不合适的策略,导致核心只能从指定内存块节点上分配内存,即使总内存还有富余,
也会由于当前节点内存不足时产生大量的swap操作。
对于NUMA,进一步了解可以参考:NUMA与英特尔下一代Xeon处理器
和 MySQL单机多实例方案
两篇文章
分享到:
相关推荐
本报告旨在通过一系列实验对比MySQL和MongoDB两种不同类型的数据库(关系型数据库与NoSQL数据库)在数据插入性能上的差异,帮助开发者在实际应用中做出更加合适的选择。 #### 测试环境 - **硬件配置**:CPU i5 ...
在基于MongoDB的Ops Manager(MMS)上进行性能调优,能够让用户通过一系列监控指标分析出MongoDB性能问题的根本原因,并据此进行相应的优化。 在进行性能调优时,我们首先需要定义用于指导性能调查的关键指标,随后...
MongoDB 性能优化方法包括优化 MongoDB 集群、解决 MongoDB 集群抖动问题、内部分享性能优化方法、给重点业务分享 MongoDB 原理等。 知识点4: MongoDB 用户群的重要性 MongoDB 用户群是提高 MongoDB 使用率的关键...
MongoDB性能测试报告详细分析了在大数据量环境下,包括GridFS和组合索引在内的性能表现。通过对5亿数据级别的插入与查询进行测试,本报告旨在探讨不同索引配置、数据量、查询方式等因素对性能的影响。 首先,测试在...
MongoDB的性能问题通常涉及到多个方面,包括硬件配置、数据导入方法、系统设置以及数据库的内部操作。在本文中,我们将深入探讨从MySQL迁移到MongoDB时遇到的一些常见问题及解决方案。 首先,当MongoDB在NUMA(Non-...
### 千万级Mysql-MongoDB性能对比报告 #### 测试环境配置 - CPU: i5 3.30GHz - 内存: 8GB - 操作系统: Windows 7 #### 测试工具与语言 - **Python**作为测试语言 - **MySQL**版本: 5.1,连接工具为**PyMySQL** -...
然而,MongoDB 的性能调优是一件非常重要的事情。本文将描述如何对 MongoDB 进行性能调优,提高 MongoDB 的查询效率和执行速度。 创建索引 创建索引是 MongoDB 性能调优的重要一步。在查询条件的字段上或者排序...
“Mongodb亿级数据量的性能测试” Mongodb亿级数据量的性能测试是指对Mongodb数据库进行大规模数据量的测试,以评估其性能和可扩展性。本文将对Mongodb亿级数据量的性能测试进行详细的分析和讨论。 普通插入性能 ...
1. **查找影响性能的原因**:这一步骤至关重要,通常需要借助于MongoDB自带的监控工具以及其他第三方监控工具来定位问题。只有准确地找到导致性能下降的原因,才能有针对性地进行下一步的优化工作。 2. **针对找出的...
在《MongoDB北京2014 - MongoDB性能扩展 - 唐建法》这一讲座中,唐建法(TJ-唐建法)作为MongoDB高级方案架构师,深入探讨了MongoDB性能扩展的关键策略。本文将基于给定的文件信息,详细介绍其中提及的主要性能优化...
MongoDB作为一款流行的NoSQL数据库,以其高性能、易扩展、灵活的查询语言等特点广泛应用于大数据处理领域。30分钟学MongoDB系列——性能优化和性能监控篇,主要聚焦于如何通过简单的步骤来优化MongoDB的性能和监控...
MongoDB 是一种基于分布式文件存储的开源 NoSQL 数据库系统,其设计支持高性能、高可用性和易扩展的特性。它通过灵活的数据模型来适应不断变化的应用需求,并被广泛应用于大数据和实时Web应用领域。接下来,我将详细...
MongoDB是一种流行的NoSQL数据库,特别适合处理大量数据和高并发场景。在这个性能测试中,我们关注的是在MongoDB中存储1亿条记录时的随机查询性能。测试环境是基于CentOS 6.4的64位操作系统,硬件配置包括一颗Intel ...
MongoDB是一个基于文档的NoSQL数据库,由C++语言编写,旨在为大量分布式数据提供高性能、高可用性和高灵活性的数据存储解决方案。MongoDB的主要特点包括: 1. **文档导向**:MongoDB存储BSON(二进制JSON)格式的...
MongoDB 是一个流行的开源文档数据库系统,以其高性能、高可用性和可伸缩性而闻名。在实际运营中,性能监控是确保系统健康运行的关键环节。MongoDB 提供了丰富的工具和命令来帮助管理员监控数据库的性能,从而进行...