ruby-on-rails - 是否有可能在多个内核中运行单个 Sidekiq 进程?

标签 ruby-on-rails ruby sidekiq

我在 MRI/YARV Ruby 2.4.6 中使用 Sidekiq。根据 MRI GIL 限制,我预计每个 Sidekiq 进程将仅限于一个核心。但似乎线程在不同的内核中运行,即使只启动了一个 Sidekiq 进程也是如此。

这是运行后的 htop 截图:bundle exec sidekiq -c 3 -L sidekiq.log -r ./worker.rb

https://user-images.githubusercontent.com/4698528/63443969-1c012700-c40c-11e9-85ee-9c4298c98c89.png

*正在使用3个核心

我读到 MRI 可以利用 OS pthreads 在不同的内核中运行一个进程。这是怎么回事?这是否会改变常见策略,例如运行多个 Sidekiq 进程以使用所有处理器容量?

  • ruby :2.4.6
  • sidekiq:5.2.7
  • 操作系统:在 ubuntu 18.04.3 主机上的 vbox 中运行的 ubuntu 18.04.3 服务器

最佳答案

我怀疑这是由 htop + 你的 CPU 调度程序的一些怪癖引起的报告问题;由于 GIL,MRI 应该只能使用 1 个核心 值(value) 的 CPU,但 CPU 调度程序不一定需要将其限制为单个逻辑核心;调度程序认为合适时,执行可能会分布在多个内核上。

你可以简单地观察一下:

ruby -e "while(1) do end" &; PID=$!; watch -n 1 ps --pid $PID -o psr; kill $PID

当您观看此视频时,您会看到进程运行的 CPU 内核随时间而变化,但使用率保持在 100% 不变。

在 htop 中查看:

ruby -e "4.times.map{Thread.new{while(1) do end}}.map(&:join)" &; PID=$!; htop -p $PID ; kill $PID

您会注意到,在 htop 中,即使您的 Sidekiq 进程报告使用了 50% 的 CPU,htop 的整体 CPU 显示显示这些内核的利用率仅为 ~30%(总和为 ~100%!)

关于ruby-on-rails - 是否有可能在多个内核中运行单个 Sidekiq 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57679589/

相关文章:

ruby - 线程安全 : Capturing the output of $stdout

ruby-on-rails - 让 ActiveJob 和 Sidekiq 与 ActionCable 一起用于聊天室

ruby-on-rails - 使用 ActiveJob,perform_now 的结果似乎与 perform_later 不同

ruby-on-rails - Rails 插件 - 安装为插件或安装为 Gem

ruby-on-rails - number_with_precision 带连字符的格式化数字

c# - 创建一个简单的 c# dll 并从 ruby​​ 访问它

ruby-on-rails - 如何在 capistrano 中为 Sinatra 项目设置 rvm

css - 添加到这个 Rails form_for 中的这个类有什么问题吗?

ruby-on-rails - 如何在 Rails 环境中运行 Ruby 文件?

ruby - 将包含数组的字符串转换为 Ruby 中的数组