记一次MongoDB性能问题(从MySQL迁移到MongoDB)
最近忙着把一个项目从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的值应付一下:
1
2
3
|
<?php
MongoCursor:: $timeout = -1;
?>
|
可惜这样并没有解决问题,错误反倒变着花样的出现了:
max number of retries exhausted, couldn't send query, couldn't send query: Broken pipe
接着使用strace跟踪了一下PHP脚本,发现进程卡在了recvfrom操作上:
1
2
|
shell> strace -f -r -p <PID>
recvfrom(<FD>,
|
通过如下命令查询recvfrom操作的含义:
1
2
|
shell> apropos recvfrom
receive a message from a socket
|
或者按照下面的方式确认一下:
1
2
|
shell> lsof -p <PID>
shell> ls -l /proc/<PID>/fd/<FD>
|
此时如果查询MongoDB的当前操作,会发现几乎每个操作会消耗大量的时间:
1
|
mongo> db.currentOp()
|
与此同时,运行mongostat的话,结果会显示很高的locked值。
…
我在网络上找到一篇:MongoDB Pre-Splitting for Faster Data Loading and Importing,看上去和我的问题很类似,不过他的问题实质是由于自动分片导致数据迁移所致,解决方法是使用手动分片,而我并没有使用自动分片,自然不是这个原因。
…
询问了几个朋友,有人反映曾遇到过类似的问题,在他的场景里,问题的主要原因是系统IO操作繁忙时,数据文件预分配堵塞了其它操作,从而导致雪崩效应。
为了验证这种可能,我搜索了一下MongoDB日志:
1
2
3
|
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大小。为了避免可能出现的问题,可以采用事先手动创建数据文件的策略:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/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记录慢操作:
1
2
|
mongo> use <DB>
mongo> db.setProfilingLevel(1);
|
不过结果显示基本都是insert操作(因为我是导入数据为主),本身就不需要索引:
1
2
|
mongo> use <DB>
mongo> db.system.profile.find().sort({$natural:-1})
|
…
问题始终没有得到解决,求人不如求己,我又重复了几次迁移旧数据的过程,结果自然还是老样子,但我发现每当出问题的时候,总有一个名叫irqbalance的进程CPU占用率居高不下,搜索了一下,发现很多介绍irqbalance的文章中都提及了NUMA,让我一下子想起之前在日志中看到的警告信息,我勒个去,竟然绕了这么大一个圈圈!安下心来仔细翻阅文档,发现官方其实已经有了相关介绍,按如下设置搞定:
1
2
|
shell> echo 0 > /proc/sys/vm/zone_reclaim_mode
shell> numactl --interleave=all mongod [options]
|
关于zone_reclaim_mode内核参数的说明,可以参考官方文档。
注:从MongoDB1.9.2开始:MongoDB会在启动时自动设置zone_reclaim_mode。
至于NUMA的含义,简单点说,在有多个物理CPU的架构下,NUMA把内存分为本地和远程,每个物理CPU都有属于自己的本地内存,访问本地内存速度快于访问远程内存,缺省情况下,每个物理CPU只能访问属于自己的本地内存。对于MongoDB这种需要大内存的服务来说就可能造成内存不足,NUMA的详细介绍,可以参考老外的文章。
理论上,MySQL、Redis、Memcached等等都可能会受到NUMA的影响,需要留意。
来源:http://www.jb51.net/article/109198.htm
记一次MongoDB性能问题(从MySQL迁移到MongoDB)相关推荐
- 视觉中国的NoSQL之路-从mysql迁移到Mongodb
起因 视觉中国网站(www.chinavisual.com)是国内最大的创意人群的专业网站.2009年以前,同很多公司一样,我们的CMS和社区产品都构建于PHP+Nginx+MySQL之上:MySQL ...
- mongo mysql 聚合性能_Mongodb和Mysql的性能分析
服务器配置: CPU: 1核 内存: 2048 MB (I/O优化) 网络带宽:1M centos 7.0 MongoDB 3.2 Mysql 5.6 服务器表数据量1184545条 M ...
- mongodb,redis,mysql简要对比
mongodb,redis,mysql 简要对比 本篇内容大部分不是原创,转载的会贴有链接. 准备学习下数据库,想对目前的主流数据库做一个简单的了解分析,就搜集了资料整理到了一块. 当下主流的要数No ...
- mongodb,redis,mysql 简要对比
本篇内容大部分不是原创,转载的会贴有链接. 准备学习下数据库,想对目前的主流数据库做一个简单的了解分析,就搜集了资料整理到了一块. 当下主流的要数NoSql数据库了,拥有强大的高并发能力. mongo ...
- Mysql,Zookeeper,Redis,Mongodb压力测试结果
1. Redis(使用fastredisclient) redis-shard 10连接 cpu 7-8% 9-12% root@gleasy cloudredis]# bin/redis-bench ...
- 阿里mysql迁移mongodb_快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装.配置.服务的启动.数据的CRUD操作函数使用.MongoDB索引的使用(唯一索引.地理索引.过期索引.全文索引等).Map ...
- elastic和mysql的区别_请问mongodb , elasticsearch , mysql各有什么优缺点?
在存储上,mongodb和es是document格式的存储,mysql是行格式的,因此mongo和es并不需要显式定义字段,而mysql需要. 在架构上,es天然就是分布式的,这个可以很容易的横向扩容 ...
- Python迁移MySQL数据到MongoDB脚本
MongoDB是一个文档数据库,在存储小文件方面存在天然优势.随着业务求的变化,需要将线上MySQL数据库中的行记录,导入到MongoDB中文档记录. 一.场景:线上MySQL数据库某表迁移到Mong ...
- 使用PowerShell调用MTools分析MongoDB性能并发送邮件
使用PowerShell调用MTools分析MongoDB性能并发送邮件 问题描述: 在MongoDB日常运维中,经常需要查看连接数的趋势图.慢查询.Overflow语句.连接来源. 解决方案: 1. ...
最新文章
- 总结一下各种IO方式
- 独家 | 如何改善你的训练数据集?(附案例)
- Eclipse安装SVN教程
- NR 5G (2G-5G)通信核心网演进
- lintcode480- Binary Tree Paths- easy
- 802.11h halow(Short Beacon, s1g beacon)
- 修改了/etc/systemd/system.conf以后必须使用daemon-reexec
- SpringBoot无法找到加载类 ,应用Feign其他服务无法package两类问题
- Redis之渐进式rehash
- Windows Server 2016补丁更新机制
- 魅族2016Java互联网方向其中一道笔试题--青蛙跳台阶问题
- Hadoop入门进阶步步高(五)-搭建Hadoop集群
- windowsbuilder 的介绍
- 文档被administrator锁定怎么解除
- html注册手机号验证,js正则表达式验证手机号码,用户名和邮箱
- 平面设计师okr_为什么说一名优秀的设计师要懂得OKR
- Dependency Walker使用说明
- linux常用桌面有两种,推荐!5款Linux常用桌面环境
- SwiftUI接入穿山甲开屏广告
- ETF操作实战记录:2022-2-21
热门文章
- java——JMM内存模型
- mysql ogg_异构平台mysql-oracle(ogg)安装部署
- linux共享xp打印机驱动下载,给debian共享winxp下的打印机
- windows下训练FCN模型所遇到的问题
- Python 2.7:字符串乱码问题的解决
- FortiAnalyzer-VM 安装使用
- public/private/protected/默认 的各种理论上的区别
- JS(截取字符串,显示当前系统时间yyyy-MM-dd,从文本框得到的数值计算)
- 源码编译安装mysql
- Windows server 2003域下全局组、本地域组及通用组之间的关系详解