3

私は、読み込みがかなり重いページを持つアプリケーション (Symfony 1.4 / Doctrine) に取り組んでいます。これらのページの 1 つには、多くの関係 (埋め込みフォーム) を持つ非常に複雑なフォームが含まれています。このページは次のようなことを行います: すべてのオブジェクトを取得し、(オブジェクトを使用して) フォームを作成し、フォームをレンダリングします。

これにより、ページあたり約 1.5 秒の読み込み時間が発生します。MySQL はボトルネックではないようです。クエリの実行には約 0.01 秒かかります。ただし、結果の水和にはさらに多くの時間がかかります。約 0.3 秒です。すべてのサブフォームの作成と埋め込みにも多くの時間がかかります (0.5 秒)。残りの時間は通常の Symfony/Doctrine メソッドに費やされます。これらの時間はすべて、Symfony タイマーおよび/または xdebug で検出されました。

オペコードのキャッシュに APC を使用することで、運用サーバーでのプロセスを高速化できることを願っていました。そこで、APC をインストールし、いくつかの構成 (キャッシュ サイズ = 400MB、最大ファイル サイズ = 20MB、念のため) を行い、最後にアプリケーションのベンチマークを行いました。

APC なし:

$ ab -n 100
Requests per second:    0.72 [#/sec] (mean)
Time per request:       1392.142 [ms] (mean)
Time per request:       1392.142 [ms] (mean, across all concurrent requests)
Transfer rate:          130.62 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4    5   3.6      4      32
Processing:  1301 1387 258.0   1338    3549
Waiting:     1229 1315 258.2   1267    3475
Total:       1305 1392 258.0   1342    3553

APC の場合:

$ ab -n 100
Requests per second:    0.86 [#/sec] (mean)
Time per request:       1160.666 [ms] (mean)
Time per request:       1160.666 [ms] (mean, across all concurrent requests)
Transfer rate:          156.67 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4    4   0.7      4       9
Processing:  1071 1156 164.1   1121    2337
Waiting:     1024 1104 164.3   1065    2286
Total:       1075 1161 164.1   1125    2341

多少の改善はありますが、結果はかなり残念です。APC が適切に機能していることを確認するために、同じサーバーで実行されている Drupal Web サイトのベンチマークも行いました。これにより、Drupal Web サイトの 1 秒あたりのリクエスト数がほぼ 2 倍になりました (4 ページ/秒から 8 ページ/秒へ)。明らかに、APC は正しく機能しています。

この高速化の欠如の原因が何であるかを知っている人はいますか? APC の有無にかかわらず、Symfony アプリケーションでベンチマークを行った人はいますか? アプリケーションのインターネットで、1 秒あたりのリクエスト数が 2 倍になるという主張をいくつか見つけることができますが、すべてベンチマークがありません。

4

1 に答える 1

4

オペコード キャッシュは、元のクラスの読み込みを高速化するだけです。多くの場合、コードがデータベースの結果をループして複雑なオブジェクトを作成する場合、APC だけでは役に立ちません。

Doctrine はクエリと結果のキャッシングをサポートしていますが、APC でのキャッシングを設定する必要があります。この URL を参照してください: http://readthedocs.org/docs/doctrine/en/latest/en/manual/caching.html

おそらくapc_add、作成後にフォームをキャッシュするために使用できます。これには、古いデータがユーザーに表示されるリスクがありますが、おそらくそれだけの価値があります。

時間がかかる理由をさらに詳しく知るには、 XDebug を使用したプロファイリングを調べる必要があります。

于 2012-05-16T14:33:39.157 に答える