流星节点进程CPU使用率接近100%

Wes*_*son 12 node.js meteor

当我的Meteor应用程序达到其高峰流量时,我遇到了问题(这个高峰没什么,1k访问量,一天可能有2,500次浏览量).CPU使用率激增并且永远不会恢复,因此我已经开始使用Nodetime来监控使用情况,并且我一直在重新加载进程(forever restart)以使事情恢复正常.

我对分析很新,所以找到根本原因使我无处可去.我相当肯定它与我的应用程序的服务器代码有关,但是分析似乎指向Fibers模块作为"热点"我理解帮助使我的服务器代码同步.

以下是分析结果的片段.我希望有人可以指导我正确的方向进行故障排除!

在此输入图像描述

Dav*_*don 33

虽然我没有针对您的问题的具体答案,但我有经验处理我们的生产流星应用程序的CPU问题,因此我可以为您提供要调查的事项列表.

  1. 升级到最新版本的meteor和相应的节点版本(请参阅更改日志).截至本文撰写时,流星为0.8.2,节点为0.10.28.

  2. 阅读文章.后者非常重要,你应该总是尝试延迟激活订阅,直到你需要它们.特别是您可能不需要为未登录的用户发布任何内容.根据我的经验,流星CPU问题与订阅有关.

  3. 小心observeobserveChanges.这些都很昂贵且易于滥用.特别是:

    • 确保stop()在不再需要时调用句柄(考虑使用像发布关系这样的包,这样就完成了).
    • 仅获取您绝对需要的集合和字段.观察通过不断区分对象(需要大量CPU)来工作.您拥有的对象越少越小,计算的越少.
  4. 退役之前考虑使用智能集合.使用oplog拖尾 - 这可以使您的应用程序在性能和CPU使用方面有日夜差异.

  5. 考虑制作一些不反应的东西(也在上面的文章中提到).对我们来说这是一场大胜利.我们有一个非常昂贵的连接,用于网站上两个经常访问的页面.当它达到CPU每100分钟大约100%挂钩的程度时,我放弃了该元素的反应性,只是在服务器上进行了连接并通过方法调用将数据发送到客户端.我还为这些结果创建了服务器端过期缓存,并由用户存储(特别感谢Matt DeBergalis提供此建议).

  6. 做一个预防性的夜间重启.我有一个cron工作,告诉forever我每天半夜重启我们的应用程序.这使CPU从大约10%降低到1%.这看起来像黑魔法,但重置后CPU使用率发生变化这一事实让我相信这是一个好主意.

更新的想法(1/13/14)

  • 我们尽快迁移到oplog尾随(流星0.7)并且这产生了很大的不同.请注意,为了访问oplog,您可能需要托管自己的数据库或在您选择的主机提供程序上运行专用实例.我还建议添加facts包来实际告诉它是否正常工作.

  • 发现了一个内存泄漏,在publish-with-relations撰写本文时,气氛版本(v0.1.5)没有被碰到以反映这些变化.如果您在生产中使用它,我强烈建议您查看HEAD版本并在本地运行它.

  • 几个星期前我们停止了夜间重启.到目前为止一切都很好(手指交叉).

更新的想法(7/2/14)

  • 几个月前,我们转而在mongohq上使用Elastic Deployment .它价格实惠,性能一直很好,甚至还有一篇博客文章,告诉你如何启用oplog拖尾.

  • 我强烈建议您查看kadira以帮助诊断应用中的性能问题.另请查看学院文章,其中包含许多好的技巧.