本文介绍了几个技巧,这些技巧可以改善Azure App Service托管应用程序的性能。其中一些技巧是你现在就可以进行的配置变更,

而其他技巧则可能需要对应用程序进行一些重新设计和重构。

开发者都希望从部署在Azure的App Services中压榨出最佳性能。
更好的性能不仅能够获得更佳的响应体验;而且如果我们在Azure中能“四两拨千斤”,那么性能的提升还可以为我们省钱。
在本文中,我们将研究提高Azure App Services中运行的Web程序性能的设置和策略。

下面几个性能提升意见在 App Service 配置界面即可操作,这一组技巧的主题是压榨出App Service本身的性能。

1.   启动HTTP/2

Microsoft于2018年初宣布在App Services中支持HTTP/2,但到目前为止在Azure中默认创建的App Service还是以HTTP1.1协议工作。HTTP/2对常见的的Web协议进行了重大更改,许多更改旨在提高性能并减少Web上的延迟。例如,HTTP/2中的标头压缩和二进制格式将减少有效负载大小。另外请求管道和多路复用等功能允许使用更少的网络套接字来执行更多并发请求,并有助于避免一个缓慢的请求阻止所有后续请求,这是HTTP 1.1中的常见问题。

为你的的App Service启动HTTP/2协议,如上图所示,下拉列表指定HTTP2.0版本后,所有支持HTTP/2的客户端都将自动升级其连接, 不支持HTTP/2的客户端仍然以原有Http1.1 方式交互。

HTTP/2不会使每个应用都受益,下面是一个简单的测试以验证HTTP/2的改进:

某App Service托管页面引用了脚本、CSS资源、16张图像,每个图像的大小超过200 KB。

使用developer tool记录使用HTTP 1.1在App Service上发生的情况。

请注意观察条形红色部分显示了后置请求以阻塞状态开始。这是可怕的“行头阻塞”问题,其中对连接数和并发请求的限制限制了客户端和服务器之间的吞吐量。直到第一个请求开始后800毫秒,客户端才会收到该页面的最终字节。

接下来在App Service中启用了HTTP / 2支持:

不需要对客户端或服务器上进行任何其他配置更改,最后一个字节不到500ms到达。由于HTTP/2提高了网络利用率,我们避免了阻塞。

2.  关闭空闲休眠

如果你有将应用程序部署到IIS的经历,那么你应该知道IIS在一段时间不活动之后将休眠(这个配置在IIS理默认是20分钟)。

Azure App Service延续了这一传统。尽管休眠可为在同一App Service Plan上运行的其他App Service提供资源,但是此策略会损害当前应用程序的性能,因为下一个传入请求将经历Web服务器冷启动的过程:缓存为空、连接池为空,站点预热,所有请求的速度都比正常情况慢。为了防止空闲关闭,您可以在“ App Service配置”刀片中设置“始终开启”标志。

3. 关闭App Service实例亲和力

即使你仅运行App Service Plan的单实例,每个Azure App Service前面都是负载平衡器。负载均衡器会转发请求到App Service实例。

因此,当App Service因流量缩放出多实例,负载均衡器使用Application Request Routing将连接会话分发给实例。

因为Azure无法知晓应用程序是不是stateless服务, 故默认的App Service将确保客户端在会话期间访问同一App Service实例。

为了实现这种亲和力,负载均衡器会在对客户端的第一个响应中注入ARRAffinity  Cookie。

如果你的应用程序是stateless,并允许负载平衡器在实例之间分配请求,请关闭请求路由cookie,以提高性能和弹性。

--------------------------------------------------------------------------------

下面的改进需要一些其他网络规划或重组(某些情况下,还需要更改应用程序本身)

下一组技巧中的主题是缩短数据在网络上传输的距离

  • 让你的服务资源相距更近,比如常规的WebApi服务,需要搭建App Service 和Database,建议你把资源放在同一区域协同工作。
  • 让你的App Service 与使用者更接近

如果大多数客户流量都来自世界的特定区域,则将资源放置在离客户最近的Azure区域中是很有意义的。当然,我们许多人的客户分布在世界各地。在这种情况下,您可以考虑跨多个Azure区域进行地理复制,以与每个人保持亲密关系,之后你使用类似Azure Traffic Manager(基于DNS技术的负载均衡器)将你的客户直接路由到 最近的服务实例。

  • 让你的服务内容与 使用者更接近

脚本、图片、CSS,视频等静态资源是在CDN边缘服务器上缓存的较好选择,一旦缓存,Azure App Service 不需要花费带宽和时间在这些资源上,专注处理动态资源。

Azure支持CDN边缘服务器的搭建

回过头来,看以上性能优化建议,第一步还是要评估当前App Service现状和性能,不是每一个策略都对你的App Service 有效。

改善Azure App Service托管应用程序性能的几个技巧的更多相关文章

  1. Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序

    一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...

  2. 如何将Azure DevOps中的代码发布到Azure App Service中

    标题:如何将Azure DevOps中的代码发布到Azure App Service中 作者:Lamond Lu 背景 最近做了几个项目一直在用Azure DevOps和Azure App Servi ...

  3. 【应用服务 App Service】当遇见某些域名在Azure App Service中无法解析的错误,可以通过设置指定DNS解析服务器来解决

    问题情形 当访问部署在Azure App Service中的应用返回 "The remote name could not be resolved: ''xxxxxx.com'" ...

  4. Azure Front Door(一)为基于.net core 开发的Azure App Service 提供流量转发

    一,引言 之前我们讲解到使用 Azure Traffic Manager.Azure LoadBalancer.Azure Application Gateway,作为项目的负载均衡器来分发流量,转发 ...

  5. 【应用服务 App Service】Azure App Service 中如何安装mcrypt - PHP

    问题描述 Azure App Service (应用服务)如何安装PHP的扩展 mcrypt(mcrypt 是php里面重要的加密支持扩展库) 准备条件 创建App Service, Runtime ...

  6. 【应用服务 App Service】在Azure App Service中使用WebSocket - PHP的问题 - 如何使用和调用

    问题描述 在Azure App Service中,有对.Net,Java的WebSocket支持的示例代码,但是没有成功的PHP代码. 以下的步骤则是如何基于Azure App Service实现PH ...

  7. 【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application

    问题描述 C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Ap ...

  8. 【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https

    问题描述 在上篇博文"[Azure 应用服务]App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)"中,实现了通过 HT ...

  9. 25个增强iOS应用程序性能的提示和技巧(高级篇)(2)

    25个增强iOS应用程序性能的提示和技巧(高级篇)(2) 2013-04-16 14:56 破船之家 beyondvincent 字号:T | T 在开发iOS应用程序时,让程序具有良好的性能是非常关 ...

随机推荐

  1. 链表源代码(C语言实现)

    源代码(C语言实现) ①.构造链表节点 typedef struct Node    //一个单独的节点                   {                         int ...

  2. IOC容器和注入方式

    IOC和DI IOC: 反转资源获取的方向 DI: IOC的另一种表述反式,即组件以一些预先定义好的方式(例如:setter方法)接收来自如容器的资源注入 IOC容器对象的关联关系 IOC前生--分离 ...

  3. php实现希尔排序

    对于排序的算法我想大家首先想到的事  冒泡排序:快速排序:或者想起选择和插入排序: 今天的讲解并不是以上四种:而是希尔排序: 对18W个数字排序,时间比较(毫秒) 希尔排序 0.1s 就完成了,有点不 ...

  4. Django-2.2.1版本关于无法使用makemigrations的错误

    报错 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0. ...

  5. Directx11教程(51) 简单的billboard

    原文:Directx11教程(51) 简单的billboard        billboard称作公告板,通常用一个quad(四边形)表示[有的billboard用两个正交的quad表示],它的特点 ...

  6. 【记录Bug】 This is probably not a problem with npm. There is likely additional logging output above.

    一个eslint的错误 我的报错如下 $ npm install > node-sass@4.11.0 install C:\Users\Administrator\Desktop\forGit ...

  7. 微服务开源生态报告 No.4

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  8. celery 动态定时任务探索

    环境: celery 4.3 flask python 3.7 linux 需求: 动态添加定时任务,且方便维护. 解决思路: 参考django-celery 或是celery源码,将定时任务配置放置 ...

  9. WebSocket简述

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 W ...

  10. AT2346 No Need

    atcoder上的题目 链接 一道思维题目 可以发现如果X是可有可无的,那么所有小于X的数也一定是可有可无的, 所有我们只要找出最大的那个可有可无的数字就好了 进一步分析,发现 若A1, A2, . ...