0

Rails 2.3.2 ruby​​ 1.8.7 mysql db および 3 つの mongrel インスタンス (windows サービス) をロード バランサーとして Apache を使用して展開しています [アップグレードの予定であることはわかっています...]

OS:Windows2003

多くの CPU 集中型タスクがあり、これらが 4 コア マシンで発生すると、mongrel プロセスは、タスクがスケジュールされたコアで最大 25% の CPU パワーしか使用できません。多くのテストを実行した後、シングル コアのパワーしか使用できないため、タスクの完了にタイム ラグがあることに気付きました。

仮想化の提案があります... クライアント サーバーでは実行が困難です。状況を改善する方法について何か提案はありますか? このプロセスでメモリは 250MB から 1GB に達しますが、これはそれほど大きな問題ではありません。

前もってありがとうライナス

4

1 に答える 1

0

通常使用される Ruby バージョン (MRI または YARV、つまり 1.8 または 1.9) は、一度に複数のコアを使用することはできません。MRI はシングルスレッドであり、内部でグリーン スレッドを提供するだけです。YARV は実際の OS スレッドを使用しますが、一度に 1 つのスレッドのみが実行されるようにする GIL (グローバル インタープリター ロック) を備えています。

したがって、mongrel はそれぞれ複数のコアを使用できません (Rails アプリをスレッドセーフにコーディングしたとしても)。グローバル インタープリター ロックなしでネイティブ スレッドを提供する JRuby や Rubinius などの代替の Ruby 実装があり、アプリで複数のコアを使用できるようになりますが、おそらくアプリを少し調整する必要があります。

とはいえ、その場合でも、1 つのリクエストが 1 つのスレッドで実行されるため、1 つのコアしか使用しません。しかし、それはあなた自身のスレッド (または少なくとも 1.9 のファイバー) を処理しないと実現するのが難しいものであり、おそらく手間をかける価値はありません。

したがって、一般的には、複数のアプリ サーバー プロセス (あなたの場合は mongrel) を開始することをお勧めします。個人的には1コアあたり1.5~3くらい(アプリにもよりますが)使っています。そうすれば、多くの並列リクエストに応答し、それらの間で共有されている使用可能な CPU パワーを完全に使用できます。

于 2012-03-27T19:18:29.607 に答える