node.js - Meteor Node 进程 CPU 使用率接近 100%

标签 node.js meteor

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

我对分析还很陌生,所以找到根本原因让我不知从何下手。我相当肯定这与我的应用程序的服务器代码有关,但分析似乎将 Fibers 模块指向一个“热点”,我理解它有助于使我的服务器代码同步。

以下是分析结果的片段。我希望有人能在正确的方向上指导我解决这个问题!

enter image description here

最佳答案

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

  1. 升级到最新版本的 meteor 和适当的 Node 版本(见 changelog)。在撰写本文时, meteor 0.8.2 和 Node 0.10.28。

  2. 阅读thisthis文章。后者提出了一个很好的观点,即您确实应该始终尝试延迟激活订阅,直到您需要它们为止。特别是您可能不需要为未登录的用户发布任何内容。根据我的经验,meteor CPU 问题与订阅有关。

  3. 小心使用 observeobserveChanges。这些是昂贵并且很容易被滥用。特别是:

    • 确保您在不再需要句柄时调用 stop()(考虑使用像 publish-with-relations 这样的包,这样就可以完成)。
    • 仅获取您绝对需要的集合和字段。通过不断区分对象来观察工作(需要大量 CPU)。您拥有的对象越少越小,需要计算的东西就越少。
  4. 考虑使用smart-collections之前是retired . 使用 oplog tailing - 这会使您的应用的性能和 CPU 使用率出现昼夜差异。

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

  6. 每晚进行一次预防性重启。我有一个 cron 作业,它告诉 forever 每天半夜重新启动我们的应用程序一次。这使 CPU 从约 10% 下降到 1%。这似乎是黑魔法,但重置后 CPU 使用率发生变化的事实让我相信这是个好主意。

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

  • 我们迁移到 oplog tailing一旦它可用( meteor 0.7),就会产生很大的不同。请注意,为了访问 oplog,您可能需要托管自己的数据库或在您选择的托管服务提供商上运行专用实例。我还建议添加 facts包来实际判断它是否工作。

  • publish-with-relations 中发现了一个内存泄漏,并且在撰写本文时,大气版本 (v0.1.5) 尚未调整以反射(reflect)这些变化。如果您在生产中使用它,我强烈建议您查看 HEAD 版本并运行它 locally .

  • 几周前我们停止了夜间重启。到目前为止,一切都很好(手指交叉)。

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

  • 几个月前,我们在 mongohq 上转而使用弹性部署。 .它价格实惠,性能非常好,他们甚至有一个 blog post它告诉你如何启用 oplog tailing。

  • 我强烈建议您查看 kadira帮助诊断应用程序中的性能问题。另请查看 academy articles其中有许多很好的技巧。

关于node.js - Meteor Node 进程 CPU 使用率接近 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19467545/

相关文章:

javascript - 如何关闭 Meteor 中的 Velocity 单元测试?

node.js - 检测 socket.io emit 是否不起作用

node.js - Bot 框架 V4 Nodejs 聊天记录记录

node.js - Stripe webhook 错误 : No signatures found matching the expected signature for payload

javascript - Uncaught Error : Expected to find a document already present for removed

meteor - 在登录时发布所有用户数据

javascript - 如何在 Meteor 中追踪匿名用户?

c - meteor 从任何地方获取数据

javascript - 避免 Node require() 的循环依赖?

javascript - 将sql查询转换为sequelize查询