Казалось бы, бесконечная трассировка стека в EF 4.0 и низкая производительность запросов под нагрузкой - PullRequest
14 голосов
/ 08 августа 2011

На большой модели EF 4.0 (более 700 сущностей) мы получаем низкую производительность на System.Data.Objects.ObjectContext.CreateObjectSet(string). Призыв к этому инициируется запросом типа context.Users.FirstOrDefault(u => u.userId = 100).

Запрос в целом работает хорошо, но при нагрузке запрос не работает. Мы запускаем 20 одновременных пользовательских загрузок для страницы, которая использует этот запрос. Приложение для этой страницы находится в режиме профилирования, т.е. мы используем профилировщик производительности Visual Studio 2010 при выполнении этого теста с небольшой нагрузкой. Профилировщик использует режим «Выборка».

Приложение построено с использованием ASP.NET 4.0 / ASP.NET MVC 3.0 и размещается в IIS 7.5 на сервере Windows 7 во время выполнения нагрузочного теста.

В отчете о профилировании показан стек вызовов, который кажется "бесконечным", т. Е. Снова и снова происходит множество обращений к приведенным ниже строкам.

System.Data.Mapping.DefaultObjectMappingItemCollection.LoadObjectMapping
    System.Data.Mapping.DefaultObjectMappingItemCollection.LoadAssociationTypeMapping
        System.Data.Mapping.DefaultObjectMappingItemCollection.LoadObjectMapping
            System.Data.Mapping.DefaultObjectMappingItemCollection.LoadAssociationTypeMapping

Что может быть причиной низкой производительности и таких бесконечно выглядящих стеков вызовов?

1 Ответ

1 голос
/ 26 августа 2011

Еще одна вещь, которую стоит попробовать, - это отличный Entity Framework Profiler - он избавил нас от многих проблем при отладке подобных проблем производительности - дает вам намного больше, чем SQL Profiler, и вы можете видеть, какие запросы / объекты создаются для ObjectContext и метода / источника линия и т. д. - http://efprof.com/

...