我在 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/