我注意到我们的节点应用程序在一天左右后内存不足。内存被每分钟左右运行一次的作业消耗掉,因为这几乎是目前唯一发生的事情。当我在我的机器上本地运行应用程序时,我可以看到应用程序也达到了内存上限,然后垃圾收集开始了。
在 heroku 上,它似乎超出了我们 1G RAM 实例的内存上限,并且 GC 没有启动。我想知道这是否是因为节点配置的内存限制比实际的 Dyno 更高。
改述:herkou 上的 node.js 内存限制是否绑定到 Dyno 内存限制?
这是heroku的回应。看起来您需要进行配置更改并且不能使用开箱即用的配置。
嗨,斯坦,
感谢您链接到这些文档;我需要更新那个终端示例,因为我最近关闭了健谈的 WEB_CONCURRENCY 输出。我们在很大程度上添加了该功能时添加了日志记录,这样人们就不会对这些侵入他们环境的新变量感到惊讶。
要查看您的应用程序的值,您可以运行:
$ heroku run 'echo $WEB_MEMORY, $WEB_CONCURRENCY' 但是,让我澄清一下 - 这些值仅用于确定集群节点应用程序应该运行多少并发进程,即使如此,也只有在您选择使用 WEB_CONCURRENCY 值时你的代码。它们根本不会影响节点二进制文件或其默认内存分配或垃圾收集,这些都是从 nodejs.org/dist 下载的完全标准的香草版本:
https://devcenter.heroku.com/articles/node-concurrency#tuning-the-concurrency-level V8 使用贪婪和懒惰的垃圾收集方法。此外,默认情况下,V8 假设您有大约 1.5 GB 可以使用(超过 2X dyno 的 1 GB 限制)。如果您有兴趣更改节点的默认内存行为,您有几个选择:
每当内存超过设定限制时手动触发 GC ( https://simonmcmanus.wordpress.com/2013/01/03/forcing-garbage-collection-with-node-js-and-v8/ )
将 max_old_space_size 设置为低于默认值(例如,节点 --max_old_space_size=960)。v8 源代码中的几个指标与 max_old_space_size 相关联,因此这可以使 gc 更具侵略性。不利的一面是,如果您超过该值甚至一个字节,您的程序就会崩溃。
将 gc_global 设置为 true 以强制始终全局收集(默认情况下为 false - 请记住,全局收集比默认的多阶段收集慢)。
将 nolazy_sweeping 设置为 true,这也使 gc 更具攻击性。
请记住,如果您在单个节点进程中超过大约 1 GB 的内存,最佳做法是将该进程拆分为多个工作程序:
https://github.com/joyent/node/wiki/FAQ#what-is-the-memory-limit-on-a-node-process 干杯,猎人
| 归档时间: |
|
| 查看次数: |
8049 次 |
| 最近记录: |