我正在尝试在 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 版本差异的原因是:
# Newer aarch64 platforms, like Raspberry Pi 5 with Debian Bookworm, are
# shipping with PAGESIZE=16K. Setting it here is retrocompatible with older
# systems, so it's safe to set it unconditionally for arm.
# This means aarch64 will use the latest jemalloc, where we can configure the
# page size, while x64 will keep using our pinned 3.6.0 jemalloc
if uname -m | grep -qi 'aarch64'; then
mkdir /jemalloc-new
cd /jemalloc-new
wget -q https://github.com/jemalloc/jemalloc/releases/download/5.3.0/jemalloc-5.3.0.tar.bz2
sha256sum jemalloc-5.3.0.tar.bz2
echo "2db82d1e7119df3e71b7640219b6dfe84789bc0537983c3b7ac4f7189aecfeaa jemalloc-5.3.0.tar.bz2" | sha256sum -c
tar --strip-components=1 -xjf jemalloc-5.3.0.tar.bz2
./configure --prefix=/usr --with-lg-page=16 && make build_lib -j"$(nproc)" && make install_lib
cd / && rm -rf /jemalloc-new
else
# jemalloc stable
题外话:为更改的良好文档点赞。
我认为错误消息来自此处对不存在的 /usr/lib/libjemalloc.so.1 的特定引用:
在 templates/web.template.yml 中对 $RUBY_ALLOCATOR 进行一个快速粗糙的覆盖似乎已成功阻止了错误消息,因此 rails (puma?) 现在似乎使用正确的 libjemalloc 运行。
话虽如此,我不知道一个正确的修复是否需要比这更多的更改,以及此类更改是否会对生产系统产生其他影响。不过,我想分享一下,以防它影响到其他尝试在 AWS 上使用 arm64 运行 Discourse 的人。也许 Discourse 团队也可以看看?
1 个赞
Falco
(Falco)
2024 年3 月 3 日 20:05
3
谢谢提醒。
正如 @merefield 提供的链接所示,我一直在积极处理 aarch64 容器镜像,但上周五没时间完成。
我认为我终于处理完所有地方了,下一步是更改主符号链接(以 .so 结尾)的 ENV,这样它就可以同时在 x64 和 ARM64 上运行。
4 个赞
太好了,对我来说真是幸运。我一直想尝试 arm64 很长时间了,但直到今天才开始做,正好和你一起在做。
当你准备好时,我很乐意帮忙测试,如果你希望使用 graviton2 实例进行测试的话。
说起来,由于自定义 jemalloc 版本可能会导致问题(但对于某些 Raspberry Pi 设置仍然是必需的),是否可以根据正在构建映像的机器上的 PAGESIZE 来决定版本?我之所以提出这个建议,是因为我正在测试的 graviton2 实例的 PAGESIZE 为 4k。在某些情况下仍然需要较新版本的 jemalloc,但这或许可以减少 arm64 和 x64 映像设置之间的差异。
Falco
(Falco)
2024 年3 月 4 日 17:20
5
几年前我曾在 Graviton 上进行过测试,效果很好。我现在正在做的工作是使其与具有非标准 PAGESIZE 的较新 ARM 平台兼容。这些更改对旧平台都是向后兼容的,因此对它们没有任何影响。
1 个赞
Falco
(Falco)
2024 年3 月 4 日 19:45
6
@mentalstring ARM64 上的安装现在应该可以开箱即用了。
3 个赞
确认它在 graviton2 上无需本地更改即可正常构建,并且日志中没有我能看到的 jemalloc 错误。感谢您解决此问题。
我将继续进行测试,因为如果 arm64 足够稳定,我们可能会将生产服务器迁移到 arm64。如果遇到其他问题,我会报告。
2 个赞