EF4 (System.Data.Entities, Nuget 패키지 없음)를 사용하고 LINQ 쿼리에 대해 직접 컨텍스트에 맞는 프로젝트가 있습니다. 여러 사용자가 (VS 테스트 부하 테스트를 사용하여) 로그인하여로드 테스트를 할 때마다 끔찍한 성능을 얻고 CPU가 100 %로 촬영되고 VS.NET은 높은 .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() 호출은 절대적인 살인이며 거의 모든 지연을 설명합니다.
검색어에 대한 추가 정보를 제공해 주시겠습니까? 얼마나 많은 로그인을하고 있습니까? –
퍼포먼스 프로 파일러가 있습니까? 문제가되는 잠금이 무엇인지 정확하게 알려야합니다. 예를 들어'Expression' 클래스가 쿼리에 많이 사용되면 잠금 경합이 발생할 수 있기 때문에 EF 자체와 완전히 관련이 없습니다. 그 처리는 내부적으로 정적 필드에 대한 잠금을 사용하여 일부 캐시에 대한 액세스를 제어합니다. –
.ToList() 호출의 코드와 호출 빈도 및 위치를 표시하는 것이 유용합니다. – Josh