迁移到Azure后性能大幅下降

目前,我们正在开展云迁移项目,我们对此进行了以下更改:

  • SQL Server 2014到Azure SQL PaaS

  • Redis缓存[Windows移植]到Azure Redis PaaS

  • 从共享驱动器到Azure文件服务的静态文件

  • 实现了数据库交互的瞬态故障处理。

  • HttpSessionState已从SQL Server更改为自定义[Redis PaaS]

应用程序有两个使用相同数据库的Web应用程序:

  • 一个内置经典的点网编码模型与网络forms。

  • 使用dot net MVC4构建的另一个应用程序。

在我们将应用程序从现有Rackspace环境[每个具有4GB RAM的2台服务器]移动到Azure并运行负载测试并收到以下结果之后:

  • MVC4应用程序的速度要快一些。

  • Web-Form应用程序开始表现不佳,负载相同,响应时间从0.46秒增加到45.8秒。

内存使用率相同,数据库利用率约为30%-40%, CPU利用率接近100%(所有Web服务器)的1100个并发用户(在Rackspace,它为4500个并发用户提供服务)。

我们测试了应用程序2 D5 azure服务器VM ,RAM更高,CPU更快。

任何人都可以突出显示如此剧烈的性能下降(一个应用程序执行几乎相同,其他一个执行几乎100倍的速度)是可能的?

注意:有一点观察,即使在停止负载测试30分钟后,CPU利用率也保持在100%。 然后它迅速下降。

我将重点概念(强调)您投入尽可能多的时间和精力来分析您的应用程序以识别瓶颈。 如果可能,在本地和Azure中运行配置文件并进行比较。

您的应用程序显然具有许多活动部件和相当大的表面积……这不是犯罪,但它确实意味着很难确定您在没有对运行时行为的一些可见性的情况下所遇到的问题。 问题可能在于您的Redis缓存,静态文件处理或会话状态加载/卸载/交互周期。 或者它可能在其他地方。 这里没有神奇的答案……你需要数据。

那就是说…我已经咨询了几个Azure迁移项目,我的经验告诉我,一个值得关注的领域是ASP.NET Web窗体代码和SQL之间的交互。 过于繁琐的应用程序(每个HTTP请求平均多个SQL调用的应用程序)和/或发出在数据库上执行大量逻辑或返回大型结果集的昂贵查询的应用程序往往在Azure等公共云中表现出较差的性能并且数据可能无法共存,“噪声邻居”问题可能会影响数据库性能等。这些问题并非Web表单应用程序或Azure所特有,但在使用以下方式编写的较旧的旧应用程序中,这些问题往往会更加严重。假设代码和数据在物理上接近。 由于您无法(完全)控制代码和数据相对于彼此存在于Azure中的位置,因此在迁移到云时,可能会在本地场景中掩盖可能出现的问题。

需要考虑的一些细节:

  1. 仔细研究在Web窗体应用程序中使用数据绑定…在实践中,它往往会鼓励昂贵的查询并将大型结果集从数据库传输到应用程序,有时您可能会在本地获取但不会在云端

  2. 再看一下你的SQL配置…你没有提到你正在使用的是哪一层(基本,标准,高级),但这个选择会对你的整体应用程序性能(和预算!)产生重大影响。 如果事实certificate(例如)您的Web窗体应用确实发出了昂贵的查询,那么使用更高层可能会有所帮助

Azure SQL DB层

  1. 熟悉“云原生”与“云能力”应用程序的概念……一般来说,仅仅因为您可以找到在云中运行应用程序的方法并不意味着它非常适合这样做。 从您的描述中可以看出,您已经努力利用一些云原生服务,因此这是一个良好的开端。 但是,如果我不得不猜测(因为我们看不到您的代码),我认为您可能需要在Web窗体应用程序中进行一些额外的重构,以使其更高效,并且能够更好地在您没有的环境中运行100%控制权。

更多关于云原生的

有关Azure迁移的日期但仍然相关的建议

如果您可以向我们提供有关您遇到瓶颈的详细信息,我们可以提供更具体的建议。

祝你好运!

代码中有一些循环导致100%的CPU。

出现问题时,从(kudu)进行转储。 在windbg中分析1)列出线程cpu time with!runaway 2)检查线程的callstack,特别是最好的cpu使用者〜* e!clrstack和〜* kb