EF4 (System.Data.Entities、nuget パッケージなし) を使用し、LINQ クエリのコンテキストを直接ヒットするプロジェクトがあります。複数のユーザーをログインさせて (VS テスト負荷テストを使用して) 負荷テストを行うと、常にパフォーマンスが低下し、CPU が 100% に達し、VS.NET は .NET ロックの競合が多く、ガベージ コレクションが多いというアラートをスローします。
かなりのプロファイリングと微調整を行うと、すべてが LINQ クエリ自体の実行を指しているように見えます (ある程度予想されることです)。結果に配置します。
誰もこれを経験しましたか?何が原因で、どうすれば解決できますか? 何らかの理由で .ToList() 呼び出しをスレッド化する必要がありますか?
更新: 数人が詳細を求めてきました..ここに問題のコードがあります (リリースできないものを削除するために少し調整されています)。
var query =
from f in context.fs
where f.usr.Any((u) => u.id == id)
select new
{
FS = f,
f.fList,
E = from e in f.fList select new { e.er },
L = from l in f.fList select new { l.id }
};
var res = query.ToList();
高負荷下では、この同じコードが複数のスレッドで実行されます (プロファイラーは 13 と表示します)。ToList() 呼び出しは絶対的な殺人であり、ほぼすべての遅延の原因となっています。