升级后空闲进程活动增加

您好,

在将 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 的工作有关?

您指的是哪份作品?我不认为我最近参与的工作会导致这个问题。

我的错,我想到的是 ember-cli。

请查看 forum.example.com/sidekiq —— 升级后可能正在运行一些后台重新处理任务。

1 个赞

极不可能触及 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”)
我需要重新构建镜像来解决这个问题吗?还是可以在容器内部直接调整或重新构建某些内容?