【发布时间】:2013-02-14 10:28:30
【问题描述】:
我有一个 sinatra 应用程序,它的运行速度比我想要的慢得多。我首先怀疑是我自己的代码是瓶颈,所以我将其提取到一个独立的基准测试脚本中。
THREADS = 100
ITERATIONS = 1
def make_calls
ITERATIONS.times do
# ... my stuff here
end
end
1.upto(THREADS) do |n|
Benchmark.bm do |bm|
threads = []
n.times do
threads << Thread.new { make_calls }
end
bm.report("#{n} threads:") { threads.each { |t| t.value } }
end
end
make_calls 调用我自己的代码的地方。我很高兴地说,当我们达到 100 个线程时,所有线程中 make_calls 的累积时间为 0.6 秒,这对于我的目的来说已经足够快了。我在上面的线程中包装 make_calls 方法的原因是因为我自己的代码使用线程(通过 java.concurrent.FixedThreadPool(500) 的 java 本机线程)/ExecutorService,我想确保这在一个环境中表现良好可能使用其他线程模型。一旦 jruby 预热,单线程中的单次迭代运行大约需要 0.02 秒。
所以上面的内容很好,但是当我使用以下内容将它添加到 sinatra Web 服务器时:
require 'sinatra'
get '/' do
# ... my stuff here
end
对该端点的请求的响应时间约为 0.5 秒 - 增加并发请求的数量,响应时间以线性方式增加。我已经使用了 jetty-rackup 和 trinidad 来尝试这个,在 linux 和 solaris 上都使用了 jruby 1.7。
我尝试优化 trinidad 实例但无济于事(最大/最小运行时间等)。我们看到的最佳性能是在线程安全中运行任一服务器!模式,并且两台服务器在此模式下都表现出比较的性能。
谁能向我解释一下时间消耗在哪里或如何改进此设置?
【问题讨论】:
-
你可以试试更快的服务器,比如puma.io
标签: sinatra jetty jruby jruby-rack trinidad-gem