记得一个MongoDB的性能问题(从MySQL迁移到MongoDB)

专门为这一项目,公司配备了高性能服务器几套,均匀的双四核CPU超线程,32G内存,MonDB操作和维修人员安装后,在我的手上,我用在新的服务器日志的使用先看看,了解基本情况,当我浏览mondb日志时发现了一些警告信息:

警告:你在NUMA机器运行。我们建议发起,建议,它被称为对与错。

我不知道NUMA当时是非常多的,所以我没有处理它。我刚把问题交给运维人员。后来我知道操作人员和维修人员都没有注意,所以问题的序幕就开了。

迁移需要进口旧data.mondb是monimport工具被使用,但它只接受JSON和源文件CSV格式,不适合我的需要,所以我没有用,但是用PHP写的一个脚本,运行一段时间后,我发现数据导入率下降,同时PHP抛出异常:

光标超时(超时:30000,时间:0:0,状态:0)

我暂时无法判断这个问题,首先考虑在PHP脚本中增加超时值:


< PHP
moncursor::超时= - 1美元;
>


遗憾的是,这不能解决问题。

最大重试次数用尽,无法发送查询,无法发送查询:破碎

然后使用strace跟踪PHP脚本和发现过程卡在recvfrom操作:


壳>信息F·R·P
recvfrom(,


以下命令用于查询的recvfrom操作的意义:


壳>关于recvfrom
从套接字接收消息


或确认以下方式:


壳> lsof -P
外壳>


在这一点上,如果你mondb查询当前的操作,我们会发现,几乎每一个操作都会消耗大量的时间:


我db.currentop()>


同时,如果你运行monstat,结果会显示一个锁定值。



我在网络上找到的一篇文章:更快的数据加载和导入mondb预裂,看起来和我的问题很相似,但他真正的问题是由于数据迁移引起的自动分割的结果,解决的办法是使用人工补片,但我不使用自动分割,自然是不原因。



我问几个朋友,有人遇到过类似的问题。在他的场景中,主要的原因是当系统IO繁忙时,数据文件被预先分配,阻塞其他操作,从而导致雪崩效应。

为了验证这种可能性,我翻遍了mondb日志。


壳> grep fileallocator / / /日志路径
{ fileallocator }分配新的数据文件…用零填充…
{ }做fileallocator配置文件…拿...秒


我用的是ext4文件系统(XFS也不错),创建数据文件是非常快,所以这不是理由,但如果有人使用ext3,他们可能会遇到这样的问题。所以我们可能会介绍如何解决这些问题。

mondb自动生成数据文件的需求:第一,0,大小为64M,然后1,规模翻了一番,128M,到5,规模翻了一番,2G,然后保持在2G的数据文件的大小。为了避免可能出现的问题,你可以使用手动创建的数据文件推进策略:


# /斌/ SH!

db_name = 1美元

CD / / /路径db_name美元

{ 5 }为50。index_number;做
file_name = db_name index_number美元美元。

如果{!E file_name美元};然后
头- C 2146435072 / dev /零> file_name美元
FI
多恩


注意:值2146435072不是标准的2G,它是由int整数范围决定的。



最后是官方论坛,那里的国际友人建议我检查指标不致贫,鞭打一匹死马,我激活仪记录运行速度慢:


周一>使用
我db.setprofilinglevel(1)>;


但是结果表明它基本上是插入操作(因为我主要是导入数据),而且它本身不需要索引:


周一>使用
周一> db.system.profile.find()。排序({ 1 } $自然:-)




这个问题一直没有解决,求人不如求己,我重复了几次的旧数据迁移过程,本质上是一样的,但是我发现一个问题的时候,总是有一个过程叫做irqbalance CPU高入住率,搜索和发现很多介绍irqbalance文章提到NUMA,让我突然记得报警信息日志中看到过,我去,甚至绕了一大圈!安的心仔细阅读了文件,发现官方已经有了相关的介绍,根据以下设置:


壳>回声0 > /proc / / / zone_reclaim_mode VM系统
壳> numactl --交织=所有蒙德{选项}


在zone_reclaim_mode内核参数的说明,你可以参考官方文档。

注:从mondb1.9.2:MonDB将在启动时自动设置zone_reclaim_mode。

为NUMA的含义,简单点说,当有多个物理CPU NUMA架构下,内存分为本地和远程,每个物理处理器都有自己的本地内存,默认情况下访问远程内存访问本地存储器的速度,每个物理CPU只能访问自己的本地存储器。MonDB,一个服务,需要大量的内存,这可能会导致内存不足,详细介绍NUMA,这可以作为一个参考的老外的文章。

在理论上,mysql,redis,memcached等可能受NUMA和需要注意的。