この.NET Webサーバーのパフォーマンスプロファイリングの問題をどのように解決しますか?
-
29-09-2019 - |
質問
使ってます Redgateパフォーマンスプロファイラー ASP.NET MVC 2アプリケーションをテストします。私が見つけたことの1つは、XmlSerializerがCPUの時間を過度に取っていたので、 この郵便受け. 。使用する場所に変更しました XmlSerializerCache
今。
これで、XMLSerializerの問題はもはや存在せず、JMeterでWebサイトを使用して80人のユーザーを同時にシミュレートすることでアプリケーションをプロファイリングしています。だから今、時間がかかる一番の方法は FirstOrDefault()
いくつかのデータを引いています私は例を挙げます -
var values=(from c in DataContext.Table1
join s in DataContext.Table2 on new { c.Id, c.date }
equals new { s.Id, s.date } into list
where c.Id== Id && c.date == date
from s in list.DefaultIfEmpty()
select new DayDTO()
{
Points = c.points,
Points1 = c.points1,
Points2 = c.points2,
Points3 = c.points3,
Points4 = c.points4
}).FirstOrDefault();
誰かが私にこれを改善するためにできることを提案できますか?現在の時間は、トップ2の方法で25秒と16秒です。それは、私が80ユーザーを同時にシミュレートしているからといって、テーブルが大きすぎてインデックス作成のようなデータベース(SQL Server 2005)側にいくつかの問題があります。など...そして私はそれを検討しますが、現在、私はあなたがC#側のコードの問題であなたが見た問題を特定しようとしています。
どんな助けにも感謝します!
解決
これは、トップタイムが「排他的な時間」ではなく「包括的時間」であることを前提としています。
包括的時間とは、メソッドによって呼び出されるコード、この場合は FirstOrDefault
データベース呼び出しが実行されます。データベース呼び出しはレイテンシのコンテキストでは高価ですが、CPUスレッドはブロックされており、データベースコールを待っている間はCPUを使用していません。
まず、これが問題であるかどうかを自問する必要があります。スループットに大きな影響を与えません(データベースサーバーが負荷を処理できると仮定します)が、通話の遅延です。
これが問題の場合、実際のSQLクエリをスピードアップする必要があります。 SQLプロファイラーを起動し、実際の質問をキャッチしてから、SQL Management Studioで実行する必要があります。実行計画を見て、クエリが予想よりも遅いかどうかを確認し、その理由を把握しようとします。遅すぎる場合は、インデックス作成をチェックして最初から確認できます。
他のヒント
FirstOrdeFaultは、おそらくあなたの場合に列挙を強制している方法であるという理由だけで、犯人として呼ばれているでしょう。その前に.tolist()を投げた場合、負担が.tolist()に移行することがわかります。