在过去一周,我们在不同的论坛上看到三个 Sidekiq 实例卡住了。当时并没有什么特别的事情发生,只是 Sidekiq 没有处理任何工作,并显示 5 个中的 5 个作业正在处理中。
一个有趣的共同点是,在这些作业中有一个关键的 BotInput 作业。现在这是一个很常见的作业,但它仍然很显眼。
重启 Sidekiq 后,一切又恢复正常。手动排队一个具有相同参数的作业不会导致它再次挂起。特定帖子调用它并没有什么特别之处。
有人知道我们该如何追踪这里发生的事情吗?
在过去一周,我们在不同的论坛上看到三个 Sidekiq 实例卡住了。当时并没有什么特别的事情发生,只是 Sidekiq 没有处理任何工作,并显示 5 个中的 5 个作业正在处理中。
一个有趣的共同点是,在这些作业中有一个关键的 BotInput 作业。现在这是一个很常见的作业,但它仍然很显眼。
重启 Sidekiq 后,一切又恢复正常。手动排队一个具有相同参数的作业不会导致它再次挂起。特定帖子调用它并没有什么特别之处。
有人知道我们该如何追踪这里发生的事情吗?
我们也遇到了类似的死机问题,我们的主机也无法弄清楚是什么原因造成的。
您是否有看到仪表板的截图?
如果可以,请尝试向 Sidekiq 进程发送 TTIN 信号,并在此处提供回溯。
抱歉,这又发生了一段时间。
sidekiq-clean.txt (35.8 KB)
日志摘要
[default] Thread TID-1ow77
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/cli.rb:199:in `backtrace'
--
[default] Thread TID-1o1jr
[default] /var/www/discourse/lib/demon/base.rb:234:in `sleep'
--
[default] Thread TID-1o1j7
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-4.8.1/lib/redis/connection/ruby.rb:57:in `wait_readable'
--
[default] Thread TID-1o1j3
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.3.8/lib/message_bus/timer_thread.rb:130:in `sleep'
--
[default] Thread TID-1o1ij AR Pool Reaper
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb:49:in `sleep'
--
[default] Thread TID-1o1hj
[default] 内部:thread_sync:18:in `pop'
--
[default] Thread TID-1o1gz AR Pool Reaper
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb:49:in `sleep'
--
[default] Thread TID-1o1gv
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:18:in `sleep'
--
[default] Thread TID-1o1gb
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:32:in `sleep'
--
[default] Thread TID-1otmb
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1otkn
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1otjz
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1otif
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1othr
[default] /var/www/discourse/app/models/top_topic.rb:8:in `refresh_daily!'
--
[default] Thread TID-1o1fb
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler.rb:80:in `sleep'
--
[default] Thread TID-1o1er
[default] /var/www/discourse/lib/mini_scheduler_long_running_job_logger.rb:87:in `sleep'
--
[default] Thread TID-1o1en heartbeat
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/launcher.rb:76:in `sleep'
--
[default] Thread TID-1o1e3 scheduler
[default] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.0/lib/connection_pool/timed_stack.rb:79:in `sleep'
--
[default] Thread TID-1ot4n processor
[default] /var/www/discourse/app/models/email_log.rb:58:in `unique_email_per_post'
--
[default] Thread TID-1ot67 processor
[default] /var/www/discourse/app/models/email_log.rb:58:in `unique_email_per_post'
--
[default] Thread TID-1ot8j processor
[default] /var/www/discourse/app/models/email_log.rb:58:in `unique_email_per_post'
--
[default] Thread TID-1ot5n processor
[default] /usr/local/lib/ruby/3.3.0/bundled_gems.rb:74:in `require'
--
[default] Thread TID-1ot6b processor
[default] /var/www/discourse/lib/distributed_mutex.rb:5:in `<main>'
--
[default] Thread TID-1o0kn final-destination_resolver_thread
[default] 内部:thread_sync:18:in `pop'
--
[default] Thread TID-1o0k3 Timeout stdlib thread
[default] 内部:thread_sync:18:in `pop'
@tgxworld 你有机会看回溯信息吗?
自从一个月前论坛升级以来,我一直遇到 Sidekiq 问题。您使用什么命令来重启 Sidekiq?只是一个 sv restart sidekiq 吗?
抱歉,我还没来得及看。这周晚些时候我会尝试处理。
在过去几天里,我一直看到这个问题。最终所有的作业都停止运行。以前我重启过,但删除关键队列安全吗?这是 Redis 队列吗?
我的版本是最新的 3.5.0.beta1-dev。
只是猜测一下,但有时我和机器人聊天时它会停止响应,所以我刷新页面或放弃。也许那些情况会让一个作业挂起?
这些任务是异步的,所以它们甚至不会知道你那样做了。
听到你在 Jobs::BotInput 上也遇到了这个问题很有意思。我们在所有服务器的一小部分(几个百分点)上都遇到了这个问题,似乎是那些大量使用叙事机器人的实例。
不,你也会丢失所有其他排队的任务。
最简单安全的方法是在容器内运行 sv reload unicorn。
我们的论坛并非如此。AI 仅对工作人员可见,我已确认没有工作人员在使用它。
我现在已禁用 AI。
BotInput 是 Discourse Narrative Bot(又名 Discobot)的一个任务,而不是 AI 机器人。
啊。我一直在大量使用 API,用户名是 discobot。
我查看了堆栈跟踪,所有问题都指向以下行存在问题:
不确定为什么那一行会引起问题,但它不是必需的,所以我将其删除了。
@RGJ 您是否因为某些原因将 Rails.application.config.eager_load 设置为禁用? ![]()
很有趣的发现,谢谢你对此进行调查。
很难说这种间歇性问题何时会消失。我已经删除了那三处最常挂起的实例中的那一行(其中一个几乎每天都会挂起)。我将在此处检查:
不,我没有弄过那个。
但是有人弄了……
Rails.autoloaders.main.do_not_eager_load(config.root.join("lib"))
在 Blaming discourse/config/application.rb at main · discourse/discourse · GitHub
@loic 你还记得为什么我们甚至不在生产环境中急切加载 lib 目录吗?
虽然本周一直出现问题,但在我们删除该 require 行的三个实例上并没有发生,所以我认为我们可以安全地假设这就是罪魁祸首
。感谢 @tgxworld 发现这一点,我永远也找不到它。
您能否将此修复向后移植到稳定版?
这与此处(当我们升级到 Rails 7.1 时)的解释有关:Upgrading Ruby on Rails — Ruby on Rails Guides
我不记得具体的问题了,但我们实际上保留了之前的行为,需要从 lib 中加载东西。