查看: 4718|回复: 5

案例分享:记一次MongoDB性能问题

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2012-2-29 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近忙着把一个项目从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是什么东西,所以没有处理,只是把问题反馈给了运维人员,后来知道运维人员也没有理会这茬儿,所以问题的序幕就这样拉开了。
    迁移工作需要导入旧数据。MongoDB本身有一个mongoimport工具可供使用,不过它只接受json、csv等格式的源文件,不适合我的需求,所以我没用,而是用PHP写了一个脚本,平稳运行了一段时间后,我发现数据导入的速度下降了,同时PHP抛出异常:
cursor timed out (timeout: 30000, time left: 0:0, status: 0)
    我一时判断不出问题所在,想想先在PHP脚本里加大Timeout的值应付一下:
<?php

MongoCursor::$timeout = -1;

?>
    可惜这样并没有解决问题,错误反倒变着花样的出现了:
max number of retries exhausted, couldn’t send query, couldn’t send query: Broken pipe
    接着使用strace跟踪了一下PHP脚本,发现进程卡在了recvfrom操作上:
shell> strace -f -r -p <PID>
recvfrom(<FD>,
    通过如下命令查询recvfrom操作的含义:
shell> apropos recvfrom
receive a message from a socket
    或者按照下面的方式确认一下:
shell> lsof -p <PID>
shell> ls -l /proc/<PID>/fd/<FD>
    此时如果查询MongoDB的当前操作,会发现几乎每个操作会消耗大量的时间:
mongo> db.currentOp()
    与此同时,运行mongostat的话,结果会显示很高的locked值。
    我在网络上找到一篇:MongoDB Pre-Splitting for Faster Data Loading and Importing,看上去和我的问题很类似,不过他的问题实质是由于自动分片导致数据迁移所致,解决方法是使用手动分片,而我并没有使用自动分片,自然不是这个原因。
    询问了几个朋友,有人反映曾遇到过类似的问题,在他的场景里,问题的主要原因是系统IO操作繁忙时,数据文件预分配堵塞了其它操作,从而导致雪崩效应。
    为了验证这种可能,我搜索了一下MongoDB日志:
shell> grep FileAllocator /path/to/log
[FileAllocator] allocating new datafile ... filling with zeroes...
[FileAllocator] done allocating datafile ... took ... secs
    我使用的文件系统是ext4(xfs也不错 ),创建数据文件非常快,所以不是这个原因,但如果有人使用ext3,可能会遇到这类问题,所以还是大概介绍一下如何解决:
    MongoDB按需自动生成数据文件:先是<DB>.0,大小是64M,然后是<DB>.1,大小翻番到128M,到了<DB>.5,大小翻番到2G,其后的数据文件就保持在2G大小。为了避免可能出现的问题,可以采用事先手动创建数据文件的策略:
#!/bin/sh

DB_NAME=$1

cd /path/to/$DB_NAME

for INDEX_NUMBER in {5..50}; do
    FILE_NAME=$DB_NAME.$INDEX_NUMBER

    if [ ! -e $FILE_NAME ]; then
        head -c 2146435072 /dev/zero > $FILE_NAME
    fi
done
    注:数值2146435072并不是标准的2G,这是INT整数范围决定的。
    最后一个求助方式就是官方论坛了,那里的国际友人建议我检查一下是不是索引不佳所致,死马当活马医,我激活了Profiler记录慢操作:
mongo> use <DB>
mongo> db.setProfilingLevel(1);
    不过结果显示基本都是insert操作(因为我是导入数据为主),本身就不需要索引:
mongo> use <DB>
mongo> db.system.profile.find().sort({$natural:-1})
    问题始终没有得到解决,求人不如求己,我又重复了几次迁移旧数据的过程,结果自然还是老样子,但我发现每当出问题的时候,总有一个名叫irqbalance的进程CPU占用率居高不下,搜索了一下,发现很多介绍irqbalance的文章中都提及了NUMA,让我一下子想起之前在日志中看到的警告信息,我勒个去,竟然绕了这么大一个圈圈!安下心来仔细翻阅文档,发现官方其实已经有了相关介绍,按如下设置搞定:
shell> echo 0 > /proc/sys/vm/zone_reclaim_mode
shell> numactl --interleave=all mongod [options]
    关于zone_reclaim_mode内核参数的说明,可以参考官方文档
    至于NUMA的含义,简单点说,在有多个物理CPU的架构下,NUMA把内存分为本地和远程,每个物理CPU都有属于自己的本地内存,访问本地内存速度快于访问远程内存,缺省情况下,每个物理CPU只能访问属于自己的本地内存。对于MongoDB这种需要大内存的服务来说就可能造成内存不足,幸好可以选择关闭它。
                                                                                        原文出处:http://huoding.com/2011/08/09/104

论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
2#
发表于 2012-3-6 16:39 | 只看该作者
感谢楼主分享,目前就要用mongo做中间层.以后多多学习

使用道具 举报

回复
论坛徽章:
5
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-20 06:00:11技术图书徽章
日期:2014-01-26 14:31:292014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
3#
发表于 2012-6-25 00:17 | 只看该作者
好贴,感谢楼主

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
4#
发表于 2012-6-25 09:42 | 只看该作者
挺好的

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
5#
发表于 2014-7-28 07:12 | 只看该作者
可以在BIOS里直接禁用掉NUMA,这样就没有后顾之忧了

使用道具 举报

回复
论坛徽章:
0
6#
发表于 2014-8-1 12:02 | 只看该作者
支持哇!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表