在EF 4.0中,看似无限的堆栈跟踪和糟糕的负载下查询性能

本文关键字:跟踪 负载 性能 查询 堆栈 无限 EF | 更新日期: 2023-09-27 18:04:51

在大型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,并在Windows 7服务器上的IIS 7.5上运行。

分析报告显示了一个似乎"无限"的调用堆栈,即有很多调用一遍又一遍地调用下面的行。

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

是什么导致了糟糕的性能和无穷无尽的调用栈?

在EF 4.0中,看似无限的堆栈跟踪和糟糕的负载下查询性能

另一个值得尝试的是出色的实体框架分析器-它为我们省去了许多调试性能问题的麻烦-它提供了比SQL分析器更多的功能,您可以看到每个ObjectContext和方法/源代码行创建了哪些查询/对象,等等- http://efprof.com/