pelcami
(Happy Lee)
1
能否有人提供配置内存分配的说明?
鉴于内核偶尔出现“内存不足”/转储消息、交换空间使用量增加 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
Falco
(Falco)
2
你运行了多少个独角兽实例?该设置在你的 /var/discourse/containers/app.yml 文件中。
pelcami
(Happy Lee)
3
你好,Rafael —— 在 app.yml 的 “env” 部分,我看到我们配置为使用 4。
pfaffman
(Jay Pfaffman)
4
您在增加内存后重新运行了 discourse-setup 吗?它会根据内存调整相关设置。您也可以在 app.yml 中阅读注释并进行相应调整。
Falco
(Falco)
5
仅使用 4 个 Unicorn 进程就发生内存溢出(OOM)确实很奇怪。这应该只占用约 2GB 内存,为 PostgreSQL 和 Redis 留出 6GB。
你需要调查在 OOM 事件中是哪个进程占用了所有内存,这种情况并不正常。
Serge
(Happy Serge)
6
你好,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
Falco
(Falco)
7
您在这个 Discourse 安装中运行了任何插件吗?
Serge
(Happy Serge)
8
我们确实运行了“定时摘要”自定义插件,但该插件也在我们的另外两个安装实例上运行,且那些实例并未出现任何问题。
Serge
(Happy Serge)
10
你好,Rafael,
该插件是由我们组织出资开发的,因此很抱歉,我无法在此公开源代码。此外,由于该插件在其他实例上运行正常,这让我怀疑问题可能出在当前服务器的内存资源不足上。该机器是虚拟机,我可以轻松地将内存容量翻倍,看看是否能解决问题。
Falco
(Falco)
11
好的,祝你好运!
对于我们从这边看不到的代码,我们很难进行调试。你可以考虑设置 Discourse 的 Prometheus 导出器插件,以便跟踪你实例上的各项指标。
Benjamin_D
(Benjamin Decotte)
12
其他实例是否也运行 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 及以上版本]:
Serge
(Happy Serge)
14
你好 Benjamin,其他实例也运行 Ruby 2.3.1-2~ubuntu16.04.14,我会测试一下更新,看看是否会影响我们的 Docker 设置。
sam
(Sam Saffron)
15
Ruby 版本在此无关紧要。
只要您使用我们官方的 Docker 镜像,就会使用 Discourse 正确支持的版本。