端到端了解App Insights有时会产生较长的响应时间

时间:2018-11-20 22:11:46

标签: asp.net entity-framework azure asp.net-core azure-storage-blobs

背景:我有一个ASP.NET Core应用程序,并且有一个API方法,该方法采用前端已上传到Azure Blob的Blob的文件名。然后,它需要创建Blob的缩略图版本,并返回新上传的缩略图Blob的名称。有时,对于完全相同的文件大小,最多可能需要40秒才能完成。通常,大约是400毫秒。

下面是App Insights的结尾,我有一些我不明白的地方:

1)请求持续时间为37.5 s,但其他操作在这段时间内相加了

2)为什么要调用主数据库?我们在多个上下文中使用EF6

3)该应用程序正在使用Azure App Service和SQL Azure。我不明白为什么响应时间如此不一致。

任何帮助将不胜感激! enter image description here

2 个答案:

答案 0 :(得分:1)

我已经多次注意到,将应用程序部署到 Azure 之后的第一个请求,或者很长一段时间没有对应用程序进行任何请求之后,获得响应所需的时间要长得多。 据我所知,它与网站的启动时间有关(如果您在基于 Windows 的基础 VM 上使用应用服务 >它仍然使用 IIS 作为反向代理)。

我通过配置运行状况检查解决了这一问题,这些检查偶尔会向应用程序执行请求。

此外,除了 Application Insights (仅在应用程序启动后才记录信息)之外,您还可以尝试使用here中列出的工具来查看更多信息。

希望有帮助!

答案 1 :(得分:0)

1。

请求时间线的显示方式仅给您整个请求的时间跨度(37.5s),以及每个依赖项的单个时间跨度。

依赖项是另一个将其运行时发送给应用程序见解的调用。 在您的示例中,对数据库的每次调用都将作为依赖项自动进行跟踪。并不是每个数据库调用之后运行的代码。

例如请求一个需要200毫秒的数据库条目,然后发出2秒的Thread.Sleep并请求另一个需要300毫秒的数据库条目,这将导致两个数据库调用依赖项之间有2秒的间隔,这两个间隔将分别以200 / 300ms列出。

您可以使用TelemetryClient.TrackDependency将自己的部分代码包装到其自己的依赖项中。这样,您将在请求时间轴上看到自己的代码作为条目。

2。

取决于EntityFramework数据库的初始化,EF将在上下文创建时连接到主数据库。 (例如,如果数据库不存在,则创建数据库。)

3。

尝试跟踪自己的代码以找出其中的哪些部分很慢。 EF需要考虑一些性能issues,请尝试了解所使用库的性能注意事项。如果您的通话速度异常缓慢,则可能是资源过度利用或缓存清空太早的问题(例如EF热查询与冷查询)。