您好,
在将 Discourse 从 2.4.x 版本升级到 v2.5.0.beta4-399-gbf8085e436 后(通过 discourse_docker git 仓库的命令行引导升级,时间点恰好在 Postgres 12 升级提交之前),服务器上的 CPU 负载明显增加(即使没有用户连接)。
“top”命令显示多个“ruby”进程频繁处于活动状态。我了解到这些是 unicorn 的 sidekiq 工作进程。运行 redis-cli monitor 可以看到,它们会发出带有 2 秒超时的阻塞式 BRPOP 请求,以检查是否有待处理的工作。这相当于每秒产生约十几个 Redis 命令。此外,统计信息每 5 秒更新一次。通过 redis-cli info stats 查看,平均每秒处理的命令数在 15 到 20 条之间。
我不确定这些活动是否足以导致我们观察到的 2-4% 的 CPU 利用率。在旧版本中,这一数值低于 0.5%。不过,我当时并未查看相同的 redis-cli 统计信息。
我很想尝试延长超时时间,看看是否有帮助,但目前尚未找到具体操作方法。
嗯,这是否与你 @eviltrout 的工作有关?
eviltrout
(Robin Ward)
3
您指的是哪份作品?我不认为我最近参与的工作会导致这个问题。
riking
(Kane York)
5
请查看 forum.example.com/sidekiq —— 升级后可能正在运行一些后台重新处理任务。
1 个赞
eviltrout
(Robin Ward)
6
极不可能触及 Redis。我永远不会把话说死,因为以前吃过亏,但我怀疑这是别的问题:slight_smile
1 个赞
不错的提示。我没看到任何异常情况,没有正在运行的任务,也没有执行时间很长的任务(只有几个超过 100 毫秒)。仪表板显示每天处理约 1000 个任务,与升级前相同。
可能有点离题,但有趣的是过去 6 个月的“已处理”图表,似乎有两个平台期(一个的高度是另一个的两倍),系统在这两个平台期之间切换,间隔为数周。这与重启无关(在此期间我们也没有更新相关组件)。
有没有简单的方法可以更改 2 秒的 BRPOP 超时设置?我在代码中没找到相关配置。如果能调整,至少可以确认轮询工作循环是否是问题所在。
我在 top 命令中有时会看到如下情况:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1024 discour+ 20 0 333584 202888 21660 S 1.3 2.5 3:35.81 ruby
1156 discour+ 20 0 715904 249416 24532 S 1.3 3.1 3:26.50 ruby
1178 discour+ 20 0 726664 251468 24564 S 1.3 3.1 3:26.11 ruby
1189 discour+ 20 0 714368 247912 24444 S 1.3 3.1 3:24.56 ruby
1200 discour+ 20 0 709760 249708 24632 S 1.3 3.1 3:22.96 ruby
1234 discour+ 20 0 713344 250288 24636 S 1.3 3.1 3:30.24 ruby
1167 discour+ 20 0 712832 247928 24436 S 1.0 3.1 3:24.75 ruby
188658 me 20 0 10424 4240 3576 R 0.7 0.1 0:00.36 top
448 root 20 0 1748444 84900 45884 S 0.3 1.1 6:09.98 dockerd
而此时没有任何连接…
每个进程累计的 3.5 分钟 CPU 时间是在运行 35 小时后产生的,期间用户活动非常少。
我还尝试使用 rbtrace,但它报错:
(pid is not listening for messages, did you require “rbtrace”)
我需要重新构建镜像来解决这个问题吗?还是可以在容器内部直接调整或重新构建某些内容?