IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

记一次MongoDB性能问题

火丁笔记 2011-08-14 15:59:30 累计浏览 4,174 次
本机暂存

    最近忙着把一个项目从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 

    发现进程卡在了recvfrom操作上:

recvfrom(,

    通过如下命令查询recvfrom操作的含义是:receive a message from a socket

shell> apropos recvfrom

    还可以按照下面的方式确认一下:

shell> lsof -p 
shell> ls -l /proc//fd/

    此时查询MongoDB当前操作,发现几乎每个操作会消耗大量的时间(secs_running):

shell> echo "db.currentOp()" | /path/to/mongo

    同时运行mongostat显示很高的locked值。

    …

    重复做了很多工作,但始终无法找到问题的症结在哪里,只好求助官方论坛,那里的技术支持都很热心,在我描述了问题后,没过多久就有了回复,建议我检查一下是不是索引不佳所致,为了验证这种可能,我激活了Profiler记录慢操作:

mongo> use 
mongo> db.setProfilingLevel(1);

    不过结果显示基本都是insert操作(因为我是导入数据为主),本身就不需要索引:

mongo> use 
mongo> db.system.profile.find().sort({$natural:-1})

    …

    问题到了这里,似乎已经走投无路了,为了死马当活马医,我又重复了几次迁移旧数据的过程,结果自然是次次都出问题,但幸运的是我发现每当出问题的时候,在top命令的结果中,总有一个名叫irqbalance的进程居高不下,搜索了一下,结果很多介绍irqbalance的文章中都提及了NUMA,让我一下子记起之前在日志中看到的警告信息,于是乎按照信息里介绍的,重新启动了一下MongoDB:

shell> numactl --interleave=all /path/to/mongod

    一切都正常了。为了解决这个问题,浪费了很多精神,实在没有力气再解释NUMA到底是什么东西了,又想了解的网友可以参考相关文章,里面的介绍很翔实。

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,253)
  2. 如何成为Python高手 (累计阅读 54,992)
  3. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,401)
  4. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  5. Mysql监控指南 (累计阅读 21,352)
  6. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  7. 什么是全栈工程师? (累计阅读 14,038)
  8. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,058)
  9. Linux 性能监控、测试、优化工具 (累计阅读 13,013)
  10. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,791)