2012-03-16 5 views
2

私はec2インスタンス上でRuby 1.9.2p290上で動作するRails 3.0.0 + passenger + apache2を使用しています。rails 3.0.0 + passenger + apache + Ruby 1.9.2

関連する旅客の設定(私は広範囲に影響なしに彼らとめちゃめちゃにしました):

PassengerMaxPoolSize 30 PassengerPoolIdleTime 0 PassengerMinInstances 10

はまた、私は、メモリやCPUバウンドないです確認しました。..

私はベンチマークをいくつか実行しており、その結果によって非常に混乱しています。私は5つの異なる.where()節を連鎖させる非常に複雑なクエリを呼び出します。 (言い換えれば、それはARELかなりを使用しています。)

私はCONCURRENCY WITHOUT 1000回の呼び出し(-c 1千-n例えば、AB)とApacheのベンチを実行すると、私は以下の取得:

Concurrency Level:  1 
Time taken for tests: 222.799 seconds 
Complete requests:  1000 
Failed requests:  0 
Write errors:   0 
Total transferred:  489000 bytes 
HTML transferred:  16000 bytes 
Requests per second: 4.49 [#/sec] (mean) 
Time per request:  222.799 [ms] (mean) 
Time per request:  222.799 [ms] (mean, across all concurrent requests) 
Transfer rate:   2.14 [Kbytes/sec] received 
私は10に同時実行を設定して、それを実行すると

は今(例えば、ABは1000年-c 10 -n)、私は次の取得:

Concurrency Level:  10 
Time taken for tests: 213.957 seconds 
Complete requests:  1000 
Failed requests:  0 
Write errors:   0 
Total transferred:  489001 bytes 
HTML transferred:  16000 bytes 
Requests per second: 4.67 [#/sec] (mean) 
Time per request:  2139.567 [ms] (mean) 
Time per request:  213.957 [ms] (mean, across all concurrent requests) 
Transfer rate:   2.23 [Kbytes/sec] received 

絶対に同時要求からもメリットはありません! 1秒あたりのリクエストはまだ4.5です。サーバーが要求を連続的に処理しているかのようです。

今、本当に奇妙な部分です。私はActiveRecordの問合せインタフェースから出力されたSQLクエリを見て、だけではなく、find_by_sqlを使用している場合、私はノー同時実行でこれを取得していない:

Concurrency Level:  1 
Time taken for tests: 49.547 seconds 
Complete requests:  1000 
Failed requests:  0 
Write errors:   0 
Total transferred:  489000 bytes 
HTML transferred:  16000 bytes 
Requests per second: 20.18 [#/sec] (mean) 
Time per request:  49.547 [ms] (mean) 
Time per request:  49.547 [ms] (mean, across all concurrent requests) 
Transfer rate:   9.64 [Kbytes/sec] received 

ここには驚き。 find_by_sqlは、ActiveRecordとARELを使用してクエリを構築するよりも高速です。私は10に同時実行が設定された以前を実行した場合しかし、私が取得:秒あたりの要求は3倍にジャンプする方法

Concurrency Level:  10 
Time taken for tests: 17.859 seconds 
Complete requests:  1000 
Failed requests:  0 
Write errors:   0 
Total transferred:  489000 bytes 
HTML transferred:  16000 bytes 
Requests per second: 55.99 [#/sec] (mean) 
Time per request:  178.587 [ms] (mean) 
Time per request:  17.859 [ms] (mean, across all concurrent requests) 
Transfer rate:   26.74 [Kbytes/sec] received 

注意してください。私の質問:

どうやってActiveRecord(とAREL)を使ってクエリをビルドすると、並行した要求があまりにも貧弱に応答するのですか? ActiveRecordは実際にそのCPUを集中的に使用できますか?

答えて

1

あなたの実際のコードを見ることなく、ARELがあなたに与えたクエリのために最適でないSQLを生成すると推測します。その結果、データベースが停止します。

ARELによって生成されたSQL文を自分のSQLと比較してください。また、ARELのクエリをデータベースで直接実行して、SQLとそのパフォーマンスを比較してみてください。両方のクエリでEXPLAINを試してください。より複雑になるにつれて、SQLの最適化が悪化するデータベースもあります。

関連する問題