Discourse更新一直失败

核心转储和无效指令表明在低级别(CPU、内存)出现了问题。

我不是硬件专家,但这款 CPU 是 12 年前上市的,我怀疑它可能太老了(即它试图运行假定为较新 CPU 的已编译代码)。

1 个赞

我们确实考虑过这个问题,但鉴于它在过去三年中运行一直良好,是什么更新了堆栈中突然需要更新的指令?(另外,是什么/哪个指令?)

FEATURE: Add support for clear_every parameter in Redis backend (#309) · discourse/message_bus@1baa1ea · GitHub 是否会在 Redis 中触发一些不同的行为?:thinking:

1 个赞

我还想补充一点,上周五主要版本升级已顺利完成,整个周末运行得毫无问题。我甚至在周日进行了一次成功的更新。如果原因是 CPU(这是可以理解的),那么在主要版本升级时就会出现此错误。

但也许自周一以来发生了一些变化……

2 个赞

这很有可能,它在消息总线代码的 JSON 解析例程中崩溃,尽管您提到的更改已有 4 个多月了。

-- C 级回溯信息 -------------------------------------------
/usr/local/lib/libruby.so.2.7(rb_vm_bugreport+0x50a) [0x7f30fc64839a] vm_dump.c:755
[0x7f30fc4b9b47]
/usr/local/lib/libruby.so.2.7(sigill+0x3b) [0x7f30fc5c4f0b] signal.c:962
/lib/x86_64-linux-gnu/libc.so.6(0x7f30fc283d60) [0x7f30fc283d60]
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/oj-3.13.15/lib/oj/oj.so(oj_parse2+0x4f9) [0x7f30f3a68339] /usr/lib/gcc/x86_64-linux-gnu/10/include/smmintrin.h:649

I, [2022-07-05T10:03:30.513303 #1]  INFO -- : cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-4.2.0/lib/message_bus/codec/json.rb:11: [BUG] 0x00007f30f3a68339 处的非法指令
ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x86_64-linux]

-- 控制帧信息 ----------------------------------------------
c:0030 p:---- s:0162 e:000161 CFUNC  :parse
c:0029 p:0013 s:0157 e:000156 METHOD /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-4.2.0/lib/message_bus/codec/json.rb:11
c:0028 p:0037 s:0152 e:000151 METHOD /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-4.2.0/lib/message_bus.rb:648
c:0027 p:0020 s:0144 e:000143 BLOCK  /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-4.2.0/lib/message_bus.rb:766
c:0026 p:0082 s:0135 e:000134 BLOCK  /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-4.2.0/lib/message_bus/backends/redis.rb:330
c:0025 p:0024 s:0130 e:000129 BLOCK  /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.5.1/lib/redis/subscribe.rb:46
c:0024 p:0034 s:0124 e:000123 BLOCK  /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.5.1/lib/redis/client.rb:183 [FINISH]
2 个赞

是的……所以它应该已经在周日出现了。:pensive:

1 个赞

查看日志,似乎在尝试启动 Redis 时已经有另一个 Redis 实例在运行。
这会是问题吗?

102:C 05 Jul 2022 09:53:34.597 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
102:C 05 Jul 2022 09:53:34.597 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=102, just started
102:C 05 Jul 2022 09:53:34.597 # Configuration loaded
102:M 05 Jul 2022 09:53:34.598 * monotonic clock: POSIX clock_gettime
102:M 05 Jul 2022 09:53:34.599 * Running mode=standalone, port=6379.
102:M 05 Jul 2022 09:53:34.599 # Server initialized
102:M 05 Jul 2022 09:53:34.599 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
102:M 05 Jul 2022 09:53:34.599 * Loading RDB produced by version 6.2.6
102:M 05 Jul 2022 09:53:34.599 * RDB age 1972 seconds
102:M 05 Jul 2022 09:53:34.599 * RDB memory usage when created 60.60 Mb
102:M 05 Jul 2022 09:53:34.949 # Done loading RDB, keys loaded: 8005, keys expired: 9.
102:M 05 Jul 2022 09:53:34.950 * DB loaded from disk: 0.351 seconds
102:M 05 Jul 2022 09:53:34.950 * Ready to accept connections
129:C 05 Jul 2022 09:53:45.056 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
129:C 05 Jul 2022 09:53:45.056 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=129, just started
129:C 05 Jul 2022 09:53:45.056 # Configuration loaded
129:M 05 Jul 2022 09:53:45.057 * monotonic clock: POSIX clock_gettime
129:M 05 Jul 2022 09:53:45.057 # Warning: Could not create server TCP listening socket *:6379: bind: Address already in use
129:M 05 Jul 2022 09:53:45.057 # Failed listening on port 6379 (TCP), aborting.
102:signal-handler (1657015415) Received SIGTERM scheduling shutdown...
102:M 05 Jul 2022 10:03:35.245 # User requested shutdown...
102:M 05 Jul 2022 10:03:35.245 * Saving the final RDB snapshot before exiting.
102:M 05 Jul 2022 10:03:39.882 * DB saved on disk
102:M 05 Jul 2022 10:03:39.882 # Redis is now ready to exit, bye bye...
3 个赞

这对于 launcher rebuild app 来说是很正常的——它不会影响任何东西(据我所知,至少是这样……)。

4 个赞

代码路径也可能在某些数据存在或不存在时触发。也许有问题的代码存在,但它没有被执行。

2 个赞

我将尝试对最近的提交进行一些准二分查找,看看是否能将其缩小到一个特定的近期更改。这需要“一些时间”…… :sweat_smile:

编辑:
好的,第一个带有非法指令的坏提交是 https://github.com/discourse/discourse/commit/4c69619334d01b9139b78039eb9d8a0cb2e1be57,它链接到 Fix NaN object dump issue · ohler55/oj@f0122cf · GitHub

一些之前的提交也无法构建,但出现了不同的问题(这也似乎是暂时的……):

I, [2022-07-05T12:14:35.377926 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
102:M 05 Jul 2022 12:14:44.308 * 300 秒内更改 100 次。正在保存...
102:M 05 Jul 2022 12:14:44.312 * 后台保存由 pid 709 启动
709:C 05 Jul 2022 12:14:45.166 * DB 已保存到磁盘
709:C 05 Jul 2022 12:14:45.169 * RDB:copy-on-write 使用 1 MB 内存
102:M 05 Jul 2022 12:14:45.217 * 后台保存已成功终止
I, [2022-07-05T12:14:46.192386 #1]  INFO -- :
I, [2022-07-05T12:14:46.193317 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake themes:update assets:precompile'

缺少 yarn 包:
包:ember-cli-deprecation-workflow
  * 指定:^2.1.0
  * 已安装:(未安装)

运行 `yarn` 来安装缺少的依赖项。

堆栈跟踪和错误报告:/tmp/error.dump.ccfa3d8342a442ee6860db37ce7c7330.log
在 /var/www/discourse/app/assets/javascripts/node_modules/ember-cli-dependency-checker 中的 ember-cli-dependency-checker 的构造函数中发生错误

error 命令因退出代码 1 而失败。
4 个赞

好发现,它确实在 oj gem 中崩溃了。

3.13.15 版本还包含此提交,该提交切换到使用 SSE 4.2 指令以提高性能。而这些指令不支持 AMD Opteron 41xx 处理器

所以我们又回到了

恕我直言,gem 作者选择将其作为编译时决定,这很糟糕。

6 个赞

太好了。oj 更新日志中未提及的另一项更改……:grin:

所以,如果 gem 在安装过程中不进行本地编译(因此我们有可能通过 OJ_USE_SSE4_2 使其正常工作),那么它似乎需要迁移服务器……:expressionless:

编辑:gem 不分发任何预编译对象,所以这应该是可行的——那么下一个问题是为什么它会在不支持 SSE4.2 的系统上进行编译。

3 个赞

我们当前的基础镜像包含 3.13.14 版本,因此它将在您的系统上进行编译。

您能否尝试使用来自 此提交 的基准测试脚本重现该错误:

○ → docker run --rm -it -u discourse discourse/base:2.0.20220621-0049 bash
discourse@313d7af3be39:/$ cd
discourse@313d7af3be39:~$ gem install --user pry benchmark-ips oj
…
Successfully installed oj-3.13.15
5 gems installed
discourse@313d7af3be39:~$ /home/discourse/.local/share/gem/ruby/2.7.0/bin/pry
[1] pry(main)> require 'benchmark/ips'
require 'oj'

def json(string)
  "\"#{string}\""
end

Benchmark.ips do |x|
  x.warmup = 5
  x.time = 20

  json_0   = json('a' *   0)
  json_64  = json('a' *  64)
  json_128 = json('a' * 128)

  x.report('Oj.load   [0]') { Oj.load(json_0) }
  x.report('Oj.load  [64]') { Oj.load(json_64) }
  x.report('Oj.load [128]') { Oj.load(json_128) }
end;

您还可以使用以下命令检查它是否是使用有问题的指令编译的:

discourse@313d7af3be39:~$ objdump -d /home/discourse/.local/share/gem/ruby/2.7.0/gems/oj-3.13.15/lib/oj/oj.so | grep -C3 pcmpestri
   2e32b:	0f 82 b5 03 00 00    	jb     2e6e6 <oj_parse2+0x8a6>
   2e331:	66 0f 6f 05 77 d6 01 	movdqa 0x1d677(%rip),%xmm0        # 4b9b0 <exp_plus+0x330>
   2e338:	00 
   2e339:	66 0f 3a 61 07 00    	pcmpestri $0x0,(%rdi),%xmm0
   2e33f:	83 f9 10             	cmp    $0x10,%ecx
   2e342:	74 dc                	je     2e320 <oj_parse2+0x4e0>
   2e344:	48 63 c9             	movslq %ecx,%rcx

如果是这样,这可能需要向 oj gem 项目报告。

3 个赞

我想进一步研究这个问题,但是 1) 我想避免更多的停机时间(至少在一段时间内;我知道上面的内容不涉及停机时间,但我可能会忍不住尝试其他方法)以及 2) 当这个发生变化时:

到 3.13.15,并且 Discourse 的 base 镜像继承了相同的最低 CPU 微架构要求,那么当前的服务器将无法维持(除非有办法绕过它,例如单独(重新)安装 gem,例如作为预代码钩子的一部分,但我猜这对大多数人来说有点麻烦)。

这也引发了一个问题:无论如何,硬件支持的合理截止日期应该是多久;不应该期望支持 32 位 CPU,所以 SSE4.2 可能是现代软件的一个合理的“新最低要求”。

5 个赞

确实,我已经在内部提出了这个问题。

:+1:

4 个赞

嘿!

感谢您对此事的关注。我在 Intel Atom N2800(2011 年末)上也遇到了同样的问题。
您认为是否有办法解决此问题,还是我现在唯一能做的就是迁移到更新的硬件?

谢谢!

我的论坛因为今天收到的更新提示而陷入了停滞状态。我从未收到过任何关于CPU即将过时的警告,这种情况突然发生……很糟糕。所有可用的服务器都配置相同以保持一致性,并且都使用相同的CPU。

AMD Athlon™ II X2 B22 Processor

在目前的经济状况下,即使有时间,也不可能突然购买新服务器、进行配置等。

在情况得到更好理解之前,我该如何撤销这次更新?论坛宕机,我现在甚至无法联系到我的用户。谢谢。

1 个赞

如果您使用的是 Docker 部署方法,您可能有一个可以重新启动的旧容器(请参阅 docker images 和/或 docker ps -a)。

您还可以通过编辑 app.yml 并将版本设置为更改之前的提交来覆盖用于构建 Discourse 实例的提交,然后重新构建:

params:
  version: adb7fa5e2fc51308efc9fc4ee57ecb1c15a85cfa

如果在此之后更新,Discourse 仍会再次中断,鉴于自那时以来已发布的安全更新(尽管对大多数实例而言,利用的可能性似乎非常有限),这并非理想情况。

3 个赞

一种选择(我还没有尝试过)是单独安装 oj gem,并希望它能使用正确的 CPU 功能(或缺乏这些功能)来触发编译。

我曾计划在 app.yml 中尝试这样做:

hooks:
  before_code:
    - exec:
        cmd:
          - gem install oj

但我没有时间进行更多的论坛停机时间了。

3 个赞

该安全更新与我无关,因为我不在共享托管环境中。我不确定如何解读 Docker 信息。这是 ps:

37c258b23221 local_discourse/app “/sbin/boot” 3 个月前 已退出 (7) 3 小时前

这是镜像列表:

REPOSITORY            TAG                 IMAGE ID       CREATED         SIZE
discourse/base        2.0.20220621-0049   a44ca4f67972   3 周前     2.65GB
local_discourse/app   latest              b5f2a8a39709   3 个月前    3.53GB
discourse/base        2.0.20220413-0411   ab71a5d97460   3 个月前    2.81GB
<none>                <none>              58ba7d1c8d7a   3 个月前    3.74GB
discourse/base        2.0.20220224-2005   cd112601450a   4 个月前    2.84GB
<none>                <none>              d9cf1feb92fd   6 个月前    3.19GB
<none>                <none>              d53ee33f6fe1   6 个月前    3.19GB
<none>                <none>              14f79500c49c   6 个月前    3.19GB
<none>                <none>              edff9b614f46   6 个月前    3.19GB
<none>                <none>              e2348b41f937   6 个月前    3.19GB
<none>                <none>              42f6511b414c   6 个月前    3.19GB
<none>                <none>              3086f92af2fe   6 个月前    3.19GB
<none>                <none>              6ada029723ba   6 个月前    3.19GB
<none>                <none>              ca61149580d4   6 个月前    3.19GB
<none>                <none>              ce5ae3bb62ac   6 个月前    3.19GB
<none>                <none>              e9a5c1b1aed4   6 个月前    3.19GB
<none>                <none>              6bb94ce1e01f   6 个月前    3.19GB
<none>                <none>              e1df4acbd927   6 个月前    3.19GB
<none>                <none>              7e05a0b160c5   6 个月前    3.19GB
<none>                <none>              979926f28a73   6 个月前    3.19GB
<none>                <none>              d055f9b01556   6 个月前    3.19GB
<none>                <none>              aa0c779093dc   6 个月前    3.19GB
discourse/base        2.0.20211118-0105   b6cc7cf8974a   7 个月前    2.58GB
discourse/base        2.0.20210528-1735   482386bf57af   13 个月前   2.36GB
<none>                <none>              e6011d2b206c   14 个月前   2.69GB
discourse/base        2.0.20210415-1332   30e4746e631e   15 个月前   2.23GB
<none>                <none>              8066ac13b8c3   17 个月前   2.45GB
discourse/base        2.0.20201221-2020   c0704d4ce2b4   18 个月前   2.11GB
<none>                <none>              043da6b3335d   2 年前      2.4GB
discourse/base        2.0.20200429-2110   dc919e1dae2c   2 年前      2.13GB
<none>                <none>              ff15472f4794   2 年前      2.79GB
discourse/base        2.0.20191013-2320   09725007dc9e   2 年前      2.3GB
<none>                <none>              f65391a062f0   2 年前      2.62GB
discourse/base        2.0.20190901-2315   10f636afbeaf   2 年前      2.29GB
<none>                <none>              6944d06786b4   2 年前      2.31GB
discourse/base        2.0.20190625-0946   2b3a5b47565f   3 年前      1.93GB
<none>                <none>              60b39deba7d2   3 年前      2.3GB
discourse/base        2.0.20190505-2322   ed87227f60d2   3 年前      1.91GB
<none>                <none>              cc5c0e56298c   3 年前      2.38GB
discourse/base        2.0.20190321-0122   7db99586b5b5   3 年前      1.97GB
<none>                <none>              b19f9a483788   3 年前      2.27GB
discourse/base        2.0.20190217        9c24db193c37   3 年前      1.92GB
hello-world           latest              fce289e99eb9   3 年前      1.84kB
<none>                <none>              614db6988e9c   3 年前      2.25GB
<none>                <none>              729b196da862   3 年前      2.25GB
<none>                <none>              80584ec5ec01   3 年前      2.25GB
<none>                <none>              0e2481aefed8   3 年前      2.25GB
<none>                <none>              725d0c17a6bb   3 年前      2.25GB
<none>                <none>              220bed95d236   3 年前      2.25GB
<none>                <none>              fca469dba597   3 年前      2.25GB
<none>                <none>              edab31d0ffce   3 年前      2.25GB
<none>                <none>              dbacaff2d35e   3 年前      2.25GB
<none>                <none>              3d6a0453da1d   3 年前      2.25GB
<none>                <none>              fbf0529eb303   3 年前      2.25GB
<none>                <none>              7a45443ae44c   3 年前      2.25GB
<none>                <none>              ad90d7f42416   3 年前      2.25GB
<none>                <none>              d61ea07d6084   3 年前      2.25GB
<none>                <none>              d393fd8b4de0   3 年前      2.25GB
discourse/base        2.0.20181031        ea31cd77735a   3 年前      1.88GB

你能试试 ./launcher start app 吗?

3 个赞