2012-03-26 12 views
-1

現在、負荷のかかっているパフォーマンスが低いと報告されているASP.NET MVC Webアプリケーションを調査中です。 (しかし、負荷はほんの少しのリクエスト/秒です)。99%読み取り専用NHibernate Webアプリケーションのパフォーマンスが悪い

マッピングには、MySQL + NHibernate + Castle ActiveRecordを使用しています。 NHibernateセッションは、すべてのセッションの始めに開かれ、開いたままにします。

可能な場合はN + 1個の問題を選択しないようにデータアクセスパターンを最適化しました。

私が考えているのは、各リクエストでデータベーストランザクションが開かれ、最後にコミットされます。 99%のリクエスト(MVCアクション)では、データをデータベースに書き込む必要はありません。

  1. セッション/トランザクションを先に閉じるか、セッションを読み取り専用としてマークすることは可能ですか?
  2. データベースのロックがボトルネックになる可能性がありますか?そうであれば、少なくとも読み取り専用トランザクションのロックを明示的に回避することは可能ですか?
+1

セッションごとにセッションファクトリーを作成するかどうかを確認してください。セッションファクトリーの作成は非常に高価で、アプリケーションの起動時や最初の要求時に一度実行する必要があります。その後、任意の数のセッションに使用できます。 –

+3

データをプロファイリングしないと、提供されるすべての回答は推測になります。 –

答えて

0

1秒あたりのリクエスト数が少ない場合は、トランザクションを開く際のオーバーヘッドが原因でパフォーマンスが低下することはありません。 NHibernateにサーバに送られたすべてのSQLを記録させてください。これはなぜ私が遅くなるのかのいくつかのアイデアを与えることができます。おそらくそれは、HTTP要求ごとに10億のクエリを送信している、そうでなければあなたのテーブルのいくつかの適切なインデックスがおそらくあなたを助けることができます。

+0

NHibernateプロファイラでこれをチェックしました。セッションあたり最大25件のリクエストがありました(これはうまくいかないが、最大5秒かかるはずはない)。トランザクションで最適化の可能性が見えない場合は、他の可能性をチェックする必要があります。 – Tarnschaf

+0

25件のリクエストに対するオーバーヘッドはごくわずかなので、リクエスト自体が長すぎる理由を知るために時間を費やす必要があります。それらのそれぞれを持って、それらのうちのどれに時間がかかりすぎるかをデータベース上で実行してください。 –

6

アプリケーションがDBから大量のデータをロードしていないことを確認する必要があります。選択されたすべてのn + 1が解決されたとしても、何百万ものレコードを読み込むことができ、非常に遅くなるでしょう。

NHibernate profilerでページを確認してください。それは最適化の提案を思い付くでしょう。そうでなければ、おそらくNHはあなたのボトルネックではありません。

+1

合意。 NHibernateプロファイラを撃つ。 – psousa

+0

さて、私たちは既にテストシステムでNHibernateプロファイラを使用しています(N + 1の問題を指摘しています)。ライブシステムに他の結果を示すかもしれない。 – Tarnschaf

関連する問題