我们刚刚开始在Azure环境中部署托管的Web应用程序。我们将数据库作为Azure SQL数据库运行,并将Web应用程序作为Azure App Service Web App运行(包括连续的WebJob)。我们在Web App上遇到了一些重大的性能问题,我希望就如何解决这些性能问题获得一些建议。
以下是一些要点:
在任何“冷”请求(站点已空闲一段时间)上,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预编译资源和用户控件,以便不按需编译它们。我还没有找到一种可靠的方法来实现这一目标。任何帮助或见解将不胜感激。