【问题标题】:Is it possible a single Sidekiq Process running in multiple cores?是否有可能在多个内核中运行单个 Sidekiq 进程?
【发布时间】:2019-08-27 17:26:48
【问题描述】:

我在 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 可以利用操作系统 pthread 在不同的内核中运行进程。这是正在发生的事情吗?这是否会改变常见策略,例如运行多个 Sidekiq 进程以使用所有处理器容量?

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

【问题讨论】:

    标签: ruby-on-rails ruby sidekiq


    【解决方案1】:

    我怀疑这是由 htop + 您的 CPU 调度程序的一些怪癖引起的报告问题;由于 GIL,MRI 应该只能使用 1 个核心的价值 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%!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2011-12-15
      • 1970-01-01
      • 2014-04-13
      相关资源
      最近更新 更多