Owin- Slow CompatibleWithModel调用

时间:2017-02-22 22:50:09

标签: entity-framework asp.net-web-api asp.net-web-api2 owin azure-mobile-services

我在Azure移动应用 Web API 的ApiController 请求中有这行代码

var user = t.TrackDependency(() => context.Users.SingleOrDefault(x => x.Email == loginRequest.Id || x.Name == loginRequest.Id), "GetUser");


以下是Application Insights的结果:

slow web api request

我们可以看到,虽然代码行占用了2613ms,但对数据库的实际查询调用耗时190ms。虽然这是一个边缘情况,但它经常足以让抱怨用户表现缓慢。

事情是我不知道差异可能来自哪里。请注意,这不是由于冷启动,当这个确切的呼叫发生时应用程序是温暖的。

第二行是对数据库端点的实际调用。在此之前,它与数据库无关。

ps:图表来自应用程序见解。它们捕获对数据库的调用,并通过TrackDependency方法添加我的onwn数据。

更新

今天,由于Application Insights采样(很棒的工具!),我获得了更多数据。 以下是结果(这不是确切的请求调用实例,但这是同样的问题):

context.Database.CompatibleWithModel long call

它清楚地表明context.Database.CompatibleWithModel(false)是罪魁祸首。通过调用我InitializeDatabase自定义实现的IDatabaseInitializer来调用它。我的自定义初始化程序设置为Startup 我在same issue

上找到了另一个关于SOF的未回答的问题

为什么需要这么长时间?

InitializeDatabase并不总是被调用,我不知道它什么时候被调用以及为什么被调用。

我找到了另一个罪魁祸首:

EntityConnection.Open waiting time

现在我们看到EntityConnection.Open正在等待某事。连接上有锁吗?到目前为止,仍未对数据库端点进行调用,因此我们仍然在此处EntityFramework

更新2

该帖子中有两个问题:

  • 为什么CompatibleWithModel会变慢?有很多关于启动时间改进的文章。这个SOF问题并未得到解决。
  • 为什么EntityConnection.Open会被阻止。这与EntityFramework无关,但如果在5分钟的窗口内没有调用连接,则通常需要3秒钟。我在特定的post中提出了这个问题。


因此,该帖子中没有其他问题可以删除,但可能仍然可用作跟踪Web Api呼叫中丢失时间的分析。

0 个答案:

没有答案