私は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がウォームアップすると、1つのスレッドでの1回の反復は約0.02秒で実行されます。
したがって、上記は適切ですが、これをsinatraWebサーバーに次のように追加すると次のようになります。
require 'sinatra'
get '/' do
# ... my stuff here
end
このエンドポイントへのリクエストの応答時間は約0.5秒です-同時リクエストの数を増やすと、応答時間は直線的に増加します。Linuxとsolarisの両方でjruby1.7を使用して、jetty-rackupとtrinidadの両方を使用してこれを試しました。
トリニダードインスタンスを無駄に最適化しようとしました(最大/最小ランタイムなど)。私たちが見た中で最高のパフォーマンスは、いずれかのサーバーをスレッドセーフで実行することです。モードであり、両方のサーバーがこのモードで比較パフォーマンスを示します。
誰かが私に時間を費やしている場所やこの設定を改善する方法を説明できますか?