0

ビデオコントローラー-アクションの表示で、2つのシナリオを試しました。最初のものはを使用increment_counterし、データベースに直接書き込みます。

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

2番目のアプローチはこの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を実行した後、100で一貫しています。データベースに直接書き込むため、メソッドよりも正確であるとviews_count想像しました。increment_countersave

私は正しくベンチングしていますか?

4

1 に答える 1

1

両方の方法で正しい答えが得られる理由は、ここでは並列処理を実際にテストしていないためです。apachebenchが10個の同時リクエストを実行している間、Railsサーバーは一度にそのうちの1つのみを処​​理します。次のいずれかを試して、2番目のシナリオに存在する競合状態を利用してください。

  • 複数のRailsサーバーを起動し、それらをロードバランサーの背後に配置します。これは、passengerを使用するか、またはそのようなものを使用して、thin -s 4すべてのサーバーをnginxまたはhaproxyインスタンスの背後に配置することで実行できます。
  • プーマの下で実行されているJRubyやrubiniusなど、GILを回避するスレッドソリューションの使用に切り替えます
于 2012-08-14T05:18:20.427 に答える