自定义插件的内存不足错误

能否有人提供配置内存分配的说明?

鉴于内核偶尔出现“内存不足”/转储消息、交换空间使用量增加 3 倍以及应用程序响应逐渐变慢,我们的应用似乎有时会出现内存不足的情况。我们系统当前拥有 8GB 内存和 2GB 交换空间。详细信息如下。

我已查阅了关于增加物理内存和交换空间的说明(https://meta.discourse.org/t/cannot-allocate-memory-when-upgrading/44029),但未能找到关于如何分配的具体细节。

在内存配置方面,我们目前使用的是所有默认设置。系统会在几分钟后恢复,但随着使用量的增加,我们认为现在是时候学习如何提升性能了。不过,我仍不确定应在何处以及如何配置这些内容。是增加分配给 Docker 实例的内存,还是增加 Ruby Unicorn 进程的数量(或两者兼有)?

我是一名系统管理员,没有 Ruby 经验,Docker 经验也有限,因此如果能指出配置文件的位置以及所需的语法,将对我有极大帮助。

Discourse 2.6.0 beta2
Ruby 2.3.1-2~ubuntu16.04.14
Ubuntu 16.04

你运行了多少个独角兽实例?该设置在你的 /var/discourse/containers/app.yml 文件中。

你好,Rafael —— 在 app.yml 的 “env” 部分,我看到我们配置为使用 4。

您在增加内存后重新运行了 discourse-setup 吗?它会根据内存调整相关设置。您也可以在 app.yml 中阅读注释并进行相应调整。

仅使用 4 个 Unicorn 进程就发生内存溢出(OOM)确实很奇怪。这应该只占用约 2GB 内存,为 PostgreSQL 和 Redis 留出 6GB。

你需要调查在 OOM 事件中是哪个进程占用了所有内存,这种情况并不正常。

你好,Rafael 及团队,我是 Serge,我与 Mr. Happy Lee 共事。他刚去休了期待已久的长假,因此我将负责处理此问题。

补充说明:该服务器最初配置为 8GB 内存和 2GB 交换空间,此后未进行升级。

在系统日志中,我发现了 Ruby 进程消耗所有内存并导致内核 OOM(内存溢出)的证据:

Killed process 2960 (ruby) total-vm:10031472kB, anon-rss:7438148kB, file-rss:0kB

我不是 Ruby 专家,因此不确定如何查看是 Ruby 中的哪个进程消耗了如此多的内存。

欢迎提供任何建议。

谢谢。

-Serge

您在这个 Discourse 安装中运行了任何插件吗?

我们确实运行了“定时摘要”自定义插件,但该插件也在我们的另外两个安装实例上运行,且那些实例并未出现任何问题。

你能把该插件的源代码仓库链接贴到这里吗?

你好,Rafael,

该插件是由我们组织出资开发的,因此很抱歉,我无法在此公开源代码。此外,由于该插件在其他实例上运行正常,这让我怀疑问题可能出在当前服务器的内存资源不足上。该机器是虚拟机,我可以轻松地将内存容量翻倍,看看是否能解决问题。

好的,祝你好运!

对于我们从这边看不到的代码,我们很难进行调试。你可以考虑设置 Discourse 的 Prometheus 导出器插件,以便跟踪你实例上的各项指标。

其他实例是否也运行 Ruby 2.3.1-2~ubuntu16.04.14?

可能没什么关系,但:

“因此这显然是一个 Ruby 的 bug。我们在多个 Ruby 版本上进行了测试,发现只有 Ruby 2.3.x 和 2.4.x 存在该内存泄漏问题(显然该问题已在 Ruby 2.5.0 中修复)。”

此外,Discourse 的 README 要求使用 [Ruby 2.6 及以上版本]::roll_eyes:

谢谢!等局势稳定后我会发布更新。

你好 Benjamin,其他实例也运行 Ruby 2.3.1-2~ubuntu16.04.14,我会测试一下更新,看看是否会影响我们的 Docker 设置。

Ruby 版本在此无关紧要。

只要您使用我们官方的 Docker 镜像,就会使用 Discourse 正确支持的版本。