【发布时间】:2011-12-30 02:49:08
【问题描述】:
我在网上阅读了大量关于不同版本的 ruby 和 rails 中线程安全和性能的资料,我认为我现在非常了解这些内容。
讨论中似乎奇怪地遗漏了如何实际部署异步 Rails 应用程序。在谈论应用程序中的线程和同步性时,人们想要优化两件事:
- 以最少的 RAM 使用率利用所有 CPU 内核
- 能够在之前的请求等待 IO 时处理新请求
第 1 点是人们(正确地)对 JRuby 感到兴奋的地方。对于这个问题,我只是想优化第 2 点。
假设这是我的应用程序中唯一的控制器:
TheController < ActionController::Base
def fast
render :text => "hello"
end
def slow
render :text => User.count.to_s
end
end
fast 没有 IO,每秒可以处理成百上千个请求,而 slow 必须通过网络发送请求,等待工作完成,然后通过网络接收应答,并且是因此比fast慢得多。
因此,理想的部署将允许满足对fast 的数百个请求,而对slow 的请求正在等待IO。
围绕网络的讨论似乎缺少的是堆栈的哪一层负责启用这种并发性。 Thin 有一个 --threaded 标志,它将“在线程中调用 Rack 应用程序 [实验性]”——这是否会为每个传入请求启动一个新线程?在持续等待传入请求的线程中处理机架应用实例?
瘦是唯一的方法还是有其他方法? ruby 运行时对于优化点 2 是否重要?
【问题讨论】:
-
我怀疑你的 ruby 版本对第 2 点有太多发言权。这将更多地取决于服务器的并发实现以及 rails 本身的组合方式。
标签: ruby-on-rails ruby multithreading rack thin