さまざまなバージョンのRubyとレールのスレッドの安全性とパフォーマンスについて、私はウェブ上で数多くの資料を読んできました。スレッドセーフな非同期Railsアプリケーションを配備するには?
実際に非同期Railsアプリケーションを配備する方法は、ディスカッションから奇妙に欠落しているようです。アプリ内のスレッドと同期の話をすると、人々は最適化する二つのものがあります。
- 以前の要求がIO上で待っている間に、最小限のRAMの使用量
- は、新しい要求にサービスを提供することができることで、すべてのCPUコアを利用することが
ポイント1は、人々が(正しく)JRubyについて興奮するところです。
TheController < ActionController::Base
def fast
render :text => "hello"
end
def slow
render :text => User.count.to_s
end
end
fast
は何のIOを持っていないし、何百、何千も1秒あたりの要求、およびslow
を提供することができます:この質問のために私は2
が、これは私のアプリで唯一のコントローラであると言う点を最適化しようとしていますネットワークを介して要求を送信し、作業が完了するのを待ってから、ネットワーク経由で応答を受信する必要があります。したがって、fast
よりもはるかに遅いです。
したがって、slow
への要求がIOで待機している間に、fast
への何百もの要求を満たすことが理想的です。
ウェブ上での議論に欠けているように見えるのは、スタックのどのレイヤーがこの並行性を有効にするかということです。 thinは--threaded
フラグを持っています。これは "Rackアプリケーションをスレッド[experimental]で呼び出します" - それは着信要求ごとに新しいスレッドを開始しますか?永続的なスレッド内にラックアプリケーションのインスタンスをスプールアップし、着信要求を待つか?
唯一の方法は薄いのですか他にはありますか?ルビランタイムはポイント2を最適化するために重要ですか?
あなたのルビーバージョンがポイント2に関して多くの意見を持っているのではないかと疑いがあります。これは、サーバの並行処理の実装と、レール自体がどのように組み合わされているかによります。 – providence