配置 Ruby 的内存限制?

能否将其设置为站点配置选项,以控制可使用的内存量?目前调优设置为 2G(编辑:哎呀,我弄错了,见下文)——之前是 4G——然而推荐的硬件配置却是 1G 内存加交换空间。在我看来,如果 Ruby 的内存使用量真的达到 2G,那么 1G 内存的节点很可能会陷入严重的分页风暴。

来自升级日志:

迁移默认配置
填充默认数据
*** 打包资源。这需要一些时间 *** 
$ RUBY_GC_MALLOC_LIMIT_MAX=20971520 RUBY_GC_OLDMALLOC_LIMIT_MAX=20971520 RUBY_GC_HEAP_GROWTH_MAX_SLOTS=50000 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=0.9  bundle exec rake assets:precompile
清理临时文件
打包资源
1 个赞

不确定这些设置在现代 Ruby 中的相关性,但 @sam 最清楚。

1 个赞

咳咳,打扰一下,那不是2G,而是20M。所以情况和我之前想的完全不一样。(编辑:情况更糟了!见下文)

1 个赞

试试 20G。:wink: :slightly_smiling_face:

1 个赞

Discourse 的内存使用是可预测的,因此您应该调整的配置项是 Unicorn 工作进程的数量。

如果您使用的是 1GB 内存的服务器,我们将默认设置为 2 个工作进程,这在此低内存配置下应能正常运行。

2 个赞

确实,在作为论坛运行时。但这并非如此!

在升级过程中,某些任务会为 Ruby 指定这些环境变量。

1 个赞

是的,在更新过程中,我们会设置这些变量,以防止在配置极低的机器上因内存压力导致升级失败。

2 个赞

好的,我的观察是,在某些情况下,这些限制可能设置得过高,因此我在想是否可以将其配置为可调整。

2 个赞

多年来,我们对该流程进行了大量测试,可以确保它适用于使用 1GB VPS 的小型社区,能够正常运行。甚至在升级过程中,它还会终止额外的 Unicorn 工作进程以释放内存,从而提供帮助。

您可以查看来自以下提交的代码:

如果您能在 Digital Ocean 的 Droplet 上复现失败情况,我们很乐意协助排查。

如果这确实是必需的,您可以 fork 该插件并根据您的需求进行调整。

4 个赞

谢谢,我现在明白了。(两个非常重要的点:这些 GC 设置是专门针对升级调整的,而且单位是字节,因此当前限制设置为 20MB。这篇较早的帖子中有一些有用且有趣的内容(因为我现在无法直接访问该链接,所以使用了归档链接)。)

2 个赞

我们应该恢复那个话题吗,@sam?它具有历史价值还是已经过时了?

1 个赞

这确实已经过时了,最新的 Ruby 有多个 malloc 限制。这是一个有趣且具有历史价值的主题,但需要在顶部加上醒目的“过时”标识。

我们的升级已经尽可能紧凑地运行了,在此基础上能做的最好的事情就是降低可用性。如果内存资源极其受限,那么在升级时您将不得不接受服务中断。

5 个赞