【问题标题】:How to check Rails app's thread safety for Puma如何为 Puma 检查 Rails 应用程序的线程安全性
【发布时间】:2015-08-11 21:29:42
【问题描述】:

我希望使用 Puma 网络服务器将我的 Rails 应用程序部署到 Heroku。但是,我不确定是否所有 Gems 都是线程安全的。阅读所有 Gems 的源代码对我们来说是不可行的选择。

有没有办法自动检查所有 Gem 的线程安全性?或者,如果执行/检测到线程不安全代码,Puma 是否会抱怨/显示特定的错误日志?

【问题讨论】:

  • FWIW Ruby 中的线程安全性充其量是不确定的。这也是 Jose 创造 Elixir 的原因之一。我不会指望任何 ruby​​ 代码中的线程安全。你最好的选择是使用 rubinius 或 jruby

标签: ruby-on-rails ruby multithreading heroku puma


【解决方案1】:

通常无法检测到线程安全。如果有某种方法可以自动检测到它,那么您的编译器/解释器可能会警告您。 Race conditions 无法被自动系统检测到,甚至难以重现。

取决于您的口译员:

  • CRubyGIL,因此使用 Puma 毫无意义。
  • 如果您使用的是JRubyRubinius,那么您可能会从Puma 中受益,而且您使用的gem 很可能已经记录了它们的方法/类线程安全性。在这种情况下,您只需检查您的代码即可。

【讨论】:

  • 即使使用 GIL,使用多线程也有其优势。当然,您将无法同时使用超过 1 个 CPU 运行您的程序,但通常在网络或 IO 之后等待的所有时间都可用于在同一进程中执行其他操作。另外,您最终会使用更少的 RAM。以 Sidekiq 为例。
  • 我仍在寻找MRI Ruby 运行PumaMRI Ruby 运行Unicorn 的最新基准。如果你能展示一些我会同意的东西,但在那之前我认为这只是一个猜测。当然,您所说的所有事情在理论上都是正确的,但在实践中,尤其是在谈到并行执行时,情况就大不相同了。
  • Unicorn 存在并且可能仍然存在一个问题,即 Unicorn 容易受到慢速客户端攻击,这是一种微不足道的 DoS 形式。这就是 Heroku 现在推荐使用 Puma 而不是 Unicorn 作为 Ruby Web 服务器的原因。
  • @art-solopov 它可以在部分情况下提供部分帮助,但专用攻击可以简单地绕过 nginx 的缓冲区大小并挂起 Unicorn。我已经阅读了技术背景,但现在找不到链接。
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2011-07-04
  • 2018-10-09
  • 2013-08-29
  • 2016-09-16
相关资源
最近更新 更多