因预编译资源导致的内存过度消耗

大家好,

非常感谢大家提供的各种建议,我们非常感激。我们认为已经找到了近期内存问题的根本原因。

此前,在构建时以 root 身份运行 bundle exec rake assets:precompile:build 并不需要 Redis 或数据库连接。但这一行为已发生变化(参考:Introducing pre-compiled JS assets for self-hostershttps://meta.discourse.org/t/introducing-a-new-build-system-for-plugins/398713)。

为适应这一变化,我们将 bundle exec rake assets:precompile:build 步骤移至运行时的初始化容器(在执行 db:migrate 等操作之前)。这样可以让该步骤以 discourse 用户身份运行,并具备访问 Redis 和数据库所需的服务权限。

然而,在执行过程中,进程陷入了 lib/plugin/js_manager.rb 中的一个循环。查看 ps -fe 输出,我们发现 pnpm 反复尝试自我安装,导致内存耗尽:

...
discour+     704     688  5 11:00 pts/0    00:00:00 node /usr/bin/pnpm -C=frontend/asset-processor node build.js
discour+     718     704  5 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     729     718  6 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     740     729  6 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     754     740  7 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
...
# 列表不断增长,导致内存耗尽

在我们的测试中发现,如果将初始化容器以 root 身份运行,并依次执行 npm uninstall -g pnpmnpm install -g pnpm@10.28.0,即可解决该循环问题,使插件编译成功完成:

...
[Plugin::JsManager] 正在编译 49 个插件...
[Plugin::JsManager] 插件初始编译完成,耗时 5.82 秒

因此,在我们过度设计基础设施或可能改变架构之前,我想向 @david 请教:是否有计划恢复 assets:precompile:build 的先前行为,使其无需 Redis 或数据库连接即可运行(类似于您在 DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 流程中所做的处理)?

另外,出于好奇:为什么以非 root 用户身份运行 node 进程会触发这种递归的 pnpm 安装循环,而以 root 身份运行似乎能避免该问题?

祝好,
Ismael