ARM64 和 jemalloc

我正在尝试在 AWS 的 graviton 实例上运行 Discourse,因为它们在价格方面很有吸引力。我知道 aarch64 支持是实验性的,但构建消息说要报告问题,所以这是我报告的问题。我认为很多人都在 AWS 上运行 Discourse,所以希望这也能使其他人受益。

在重新构建并进行一些基本的健全性检查以确保前端加载后,我成功地在 arm64 上运行了一个现有安装。但是,./launcher logs web_only 显示 rails.stderr.log 不断被以下内容填充:

ERROR: ld.so: object '/usr/lib/libjemalloc.so.1' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/usr/lib/libjemalloc.so.1' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.

事实上,在 arm64 上不存在 /usr/lib/libjemalloc.so.1,但在 x86 镜像上存在。我追踪到 arm64 版本差异的原因是:

题外话:为更改的良好文档点赞。

我认为错误消息来自此处对不存在的 /usr/lib/libjemalloc.so.1 的特定引用:

templates/web.template.yml 中对 $RUBY_ALLOCATOR 进行一个快速粗糙的覆盖似乎已成功阻止了错误消息,因此 rails (puma?) 现在似乎使用正确的 libjemalloc 运行。

话虽如此,我不知道一个正确的修复是否需要比这更多的更改,以及此类更改是否会对生产系统产生其他影响。不过,我想分享一下,以防它影响到其他尝试在 AWS 上使用 arm64 运行 Discourse 的人。也许 Discourse 团队也可以看看?

1 个赞

相关:

2 个赞

谢谢提醒。

正如 @merefield 提供的链接所示,我一直在积极处理 aarch64 容器镜像,但上周五没时间完成。

我认为我终于处理完所有地方了,下一步是更改主符号链接(以 .so 结尾)的 ENV,这样它就可以同时在 x64 和 ARM64 上运行。

4 个赞

太好了,对我来说真是幸运。我一直想尝试 arm64 很长时间了,但直到今天才开始做,正好和你一起在做。

当你准备好时,我很乐意帮忙测试,如果你希望使用 graviton2 实例进行测试的话。

说起来,由于自定义 jemalloc 版本可能会导致问题(但对于某些 Raspberry Pi 设置仍然是必需的),是否可以根据正在构建映像的机器上的 PAGESIZE 来决定版本?我之所以提出这个建议,是因为我正在测试的 graviton2 实例的 PAGESIZE 为 4k。在某些情况下仍然需要较新版本的 jemalloc,但这或许可以减少 arm64 和 x64 映像设置之间的差异。

几年前我曾在 Graviton 上进行过测试,效果很好。我现在正在做的工作是使其与具有非标准 PAGESIZE 的较新 ARM 平台兼容。这些更改对旧平台都是向后兼容的,因此对它们没有任何影响。

1 个赞

@mentalstring ARM64 上的安装现在应该可以开箱即用了。

3 个赞

确认它在 graviton2 上无需本地更改即可正常构建,并且日志中没有我能看到的 jemalloc 错误。感谢您解决此问题。

我将继续进行测试,因为如果 arm64 足够稳定,我们可能会将生产服务器迁移到 arm64。如果遇到其他问题,我会报告。

2 个赞

此主题已在 4 天后自动关闭。不再允许回复。