Azure App Service Web App资源和用户控件加载缓慢

时间:2016-01-13 16:22:48

标签: asp.net azure azure-web-app-service

我们刚刚开始在Azure环境中部署托管的Web应用程序。我们将数据库作为Azure SQL数据库运行,并将Web应用程序作为Azure App Service Web App运行(包括连续的WebJob)。我们在Web App上遇到了一些重大的性能问题,我希望就如何解决这些性能问题获得一些建议。

以下是一些要点:

  • Web App部署为已编译的Web应用程序(二进制文件,标记,* .resx文件),而不是源代码
  • Web App通过FTP部署
  • 网页应用已启用“始终开启”
  • App Service正在美国中南部的Azure数据中心运行
  • Azure SQL数据库也在美国中南部的Azure数据中心运行(因此数据库延迟应该是最小的)
  • 我们拥有在洛杉矶数据中心的非Azure服务器上运行的Web应用程序(相同的二进制文件等)的精确副本(如果数据库延迟是问题,此站点的数据库延迟会更差)
  • Web应用程序的两个实例(Azure和非Azure)都连接到完全相同的Azure SQL数据库(在美国中南部的Azure数据中心中运行)
  • 我一直在犹他州的工作站进行测试 - 并不是特别靠近任何一个网络服务器

在任何“冷”请求(站点已空闲一段时间)上,Azure站点似乎要慢得多。从非Azure服务器快速加载的页面需要很长时间(例如20秒或更长时间)从Azure服务器。内容是相同的,两个应用程序都访问相同的数据库 - 所以我不认为这是一个数据库问题。我把它缩小到两个似乎是问题的.NET函数:

System.Web.UI.TemplateControl.GetLocalResourceObject(字符串) System.Web.UI.TemplateControl.LoadControl(字符串)

该应用程序包含几种不同语言的* .resx文件。当请求进入时,它使用请求标头中的区域性来加载正确的资源。 GetLocalResourceObject函数似乎在动态编译* .resx文件,在Azure服务器上似乎需要几秒钟。我可能需要尝试this之类的内容来阻止Azure动态编译* .resx文件。

我们的一些页面动态加载控件,因此调用LoadControl方法。这些控件部署为* .ascx标记,但代码隐藏已编译为。\ bin文件夹中的* .dll。即使已经编译了控件,看起来LoadControl函数正在尝试编译每个控件,这在Azure服务器上需要几秒钟。

Azure服务器上的“热门”页面访问速度似乎更快(几乎与非Azure服务器一样快),可能是因为资源和控件已经编译并仍在内存中。我还没有能够确定资源/控件必须在什么时候重新编译。

我正在努力找出使网站响应良好的最佳方式,即使是在“冷”请求上也是如此。我尝试在Azure App Service服务器上运行aspnet_compiler.exe(通过Kudu CMD)。这似乎有时会起作用,但它不是非常可靠(有时似乎不起作用,或者过程似乎没有完成)。看来,即使在编译网站之后,问题也会在闲置一段时间后恢复。

我们的主要目标是使Azure应用服务Web应用程序具有可接受的性能。似乎唯一的方法是强制Web App预编译资源和用户控件,以便不按需编译它们。我还没有找到一种可靠的方法来实现这一目标。任何帮助或见解将不胜感激。

0 个答案:

没有答案