我有一個項目使用EF4(System.Data.Entities,沒有nuget包)並直接命中LINQ查詢的上下文。每當我通過多個用戶登錄進行負載測試(使用VS測試負載測試)時,我的性能表現非常糟糕,我的CPU速度達到100%,VS.NET在高鎖定爭用和高垃圾收集方面拋出警報。使用EF4在ToList()上高鎖爭用和性能下降
在進行大量的分析和調整時,一切似乎都指向了LINQ查詢本身的執行(預計會在某種程度上)以及我們所做的.ToList()調用上令人難以置信的爭用量在結果的一堆地方。
有沒有人遇到過這個?原因是什麼?如何解決這個問題?我是否需要出於某種原因調出.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()調用是絕對謀殺,並且幾乎涵蓋了所有的延遲。
你能提供一些關於查詢的更多信息嗎?我們在談論多少登錄? –
你有性能分析器嗎?它應該確切地告訴你哪個鎖導致問題。它可能與EF本身完全無關,因爲例如用於查詢的'Expression'類也可能導致鎖爭用。其處理內部使用鎖定靜態字段來控制對某些緩存的訪問。 –
顯示.ToList()調用的代碼以及它們被調用的頻率或位置將會很有用。 – Josh