我正确使用ApacheBench吗?

时间:2012-08-14 04:45:46

标签: ruby-on-rails ruby-on-rails-3 concurrency apachebench

在视频控制器中 - 显示操作,我尝试了两种方案。第一个使用increment_counter,并直接写入数据库:

Video.increment_counter(:views_count, @video.id)

第二种方法使用save方法。

@video.views_count = @video.views_count + 1
@video.save

在ApacheBench中,我这样做:

ab -n 100 -c 10 http://127.0.0.1:3000vidoes/18

视频ID为18.我确保通过views_count在每次ab运行时重置Video.find(18).update_attribute(:views_count, 18)

在两种情况下运行ApacheBench之后,views_count在100处保持一致。我会想象increment_countersave方法更准确,因为它直接写入数据库。 / p>

我正确地坐着吗?

1 个答案:

答案 0 :(得分:1)

您使用这两种方法得到正确答案的原因是您并未在此处测试并行性。虽然apachebench启动了10个并发请求,但您的rails服务器一次只处理其中一个请求。尝试以下方法之一来利用第二种情况中出现的竞争条件:

  • 启动多个rails服务器并将它们放在负载均衡器后面。您可以通过乘客或thin -s 4之类的方式执行此操作,然后将所有这些服务器放在nginx或haproxy实例后面。
  • 切换到使用避免GIL的线程解决方案,如JRuby或在puma下运行的rubinius