使用阿里云CDN加速后网站访问速度较慢

问题描述

在使用阿里云CDN加速后,网站访问速度比较慢。由于造成访问慢的影响因素很多,如何去分析定位问题、优化网站速度、解决问题是一个十分重要的课题,本文对此进行详细介绍。

解决方案

说明

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

当您使用阿里云CDN加速后,出现网站访问速度比较慢的问题时,请参考以下内容解决问题。

分析思路

在排查分析问题前,需要了解CDN的加速原理,请参见什么是阿里云CDN,它将有助于帮助您如何去思考和分析问题存在的可能原因。简单来说,CDN主要是通过在现有网络中增加一层新的缓存节点,将网站服务器的资源发布到最接近用户的网络节点,使得用户侧客户端在请求时直接访问到就近的CDN节点并命中该资源,减少回源情况,提高网站访问速度。因此,造成访问慢的可能原因可以简单归纳为以下几个类型:

  • 客户端本地网络因素,例如客户端下行带宽不足、DNS配置错误等。

  • 客户端到CDN节点之间的网络不佳,网络延迟较高。

  • CDN节点异常,响应速度慢。

  • 资源内容比较大,导致下载比较耗时。

  • CDN回源到源站时,回源网络不佳。

  • 源站本身响应速度慢。

通过搜集一些问题现象和信息,我们可以进一步分析,初步确定排查方向,这也是一个非常重要的环节。

  1. 可以先确认是否是全网都存在访问慢的问题,还是个别用户访问慢,亦或是某一个地区、某一个运营商的用户访问慢。阿里云为您提供了应用实时监控服务ARMS云监控等产品,您可以通过这些产品设定某一地区、某一运营商网络的探测机器去探测,精准性更高:

    • 如果只是极个别用户访问不佳,那么可能跟用户侧的网络有强相关性,很可能就是用户侧的网络问题。

    • 判断异常用户是否有集中性,比如:某市大量移动用户访问异常,而该市联通和电信用户访问正常。这种情况就有可能跟该地区的运营商网络有一定关联,可以使用一些基调工具,用该地区的探测机器进行探测。

    • 如果全网用户都存在访问慢的问题,那就可能是源站响应问题或者是配置方面的问题,因为几乎不可能同时所有的CDN节点或者所有地区的网络都出现问题。例如:排查是否是加速区域选择的错误,是否是动态请求或者无法缓存的请求,源站响应慢,需要重点往这方面考虑。

  2. 确认访问慢或者异常的请求是否被CDN缓存:

    • 如果是命中CDN缓存的请求,那么就不存在CDN回源,因此CDN会直接把节点上的缓存数据返回给客户端,这种情况就和源站没有关系。

    • 如果是没有命中缓存,那么需要重点查看是客户端到CDN的链路慢,还是源站响应慢。

衡量指标

使用CDN加速,除了通用的数据观测指标外,不同的场景下也有更具体的指标。观测这些指标,不仅可以帮助您体验CDN加速的效果,也能观测自身业务使用CDN的情况,帮助您更好地做出调整和决策。阿里云CDN官方帮助文档中心提供了CDN的衡量指标的介绍文档,请参见CDN的衡量指标

信息搜集

我们知道一次完整的HTTP请求需要经过DNS解析>TCP建连>SSL握手(HTTPS需要SSL握手)>客户端发送请求>服务端响应请求的过程,了解HTTP请求的过程将有助于我们更深层次的去分析问题,因此在客户端侧搜集一些信息很有必要,通常可以搜集以下的几点信息。

搜集客户端网络情况和CDN节点IP

使用ping命令连接加速域名,确认是否正确解析到CDN,以及客户端到CDN节点之间网络是否是通畅,网络延迟如何。如果无法ping通,则需要进行一些链路诊断,具体信息请参见链路诊断方法

搜集客户端IP和LocalDNS

CDN的节点调度策略是根据客户端的LocalDNS来分配调度,因此确认客户端的LocalDNS是否设置正确非常重要。可访问阿里昆仑用户诊断工具,获取客户端IP以及客户端DNS。

查找访问慢的URL

可以打开浏览器开发者模式,切换到Network标签页,输入URL之后,在Network标签页中查看浏览器发出的所有HTTP请求。单击Time选项,按照时间来排序,查看具体是哪些资源请求慢,在Domain列找到CDN加速域名下访问慢的URL。

说明

通常情况下,一个网站加载的资源比较多,可能存在一些非CDN加速的URL,这时一些非CDN的资源访问慢,而CDN加速的资源都访问快,但是就是这些非CDN加速的资源加载慢导致整个网站响应速度变慢。因此根据Time排序,确认到底是哪些URL访问慢。

搜集HTTP请求的请求头和响应头

单击Network标签页访问慢的HTTP请求Name值,在Headers标签下可以看到这次请求的General、Response Headers和Request Headers信息。通过请求头和响应头,我们可以了解这次请求是否是一个静态请求,且是否命中缓存等信息。

说明

如果是手机4G慢,则需要在手机侧抓包获取信息,该操作对一般用户可能会有一些困难。可以考虑打开手机热点,PC端连接热点,在PC端搜集信息。

搜集HTTP请求的Timing信息

Timing标签中可以显示资源在整个请求生命周期过程中各部分时间花费信息。

常见案例

在了解CDN的加速原理和HTTP请求过程的基础下,结合问题现象进行初步分析,然后根据搜集到客户端侧的信息一起判断,基本已经可以发现或定位一些问题。下面介绍一些典型的问题案例。

案例一:客户端到CDN节点网络质量不佳

客户端使用ping命令测试加速域名,发现网络延迟较大,甚至出现丢包。这种情况下需要搜集客户端的IP、客户端的DNS以及ping的信息截图、MTR的信息截图。因为CDN调度节点是通过客户端的DNS来分配调度,根据客户端IP、DNS以及CDN节点可以判断调度是否异常,通过ping以及mtr的信息截图可以看到网络延迟以及具体延迟在哪个网络链路节点。本节通过两个案例进行介绍。

加速区域设置错误

中国内地的用户被解析到海外的节点,或者海外用户被解析到中国内地,具体场景如下所示:

说明

这种情况建议将加速区域设置为“全球”。

  • CDN的加速区域选择的是“仅中国内地”,那么该域名的调度域就只有中国内地的CDN节点,海外用户访问该域名时,都会调度到中国内地的CDN节点。

  • 加速区域选择的是“全球(不包含中国内地)”,那么该域名的调度域里就只有除中国内地之外的CDN节点,中国内地用户都会调度到海外的CDN节点。

客户端DNS设置错误

客户端DNS设置错误需要用户侧修改使用对应所在地对应运营商的DNS:

  • 一个广东移动的用户,使用了联通的DNS服务器,则会导致该用户请求到联通的CDN节点,远距离调度会延长网络链路。

  • 一个广东移动的用户,使用了哈尔滨移动的DNS服务器,则会导致该用户请求到哈尔滨移动的CDN节点,远距离调度延长网络链路。

说明

如果加速区域和DNS设置正确,在CDN正确分配调度的情况下,网络质量还是差,则需要搜集traceroute和mtr信息进一步诊断。

案例二:缓存命中率低或频繁回源

CDN在静态资源加速场景的应用,将静态资源缓存在距离客户端最近的CDN节点。用户访问该资源时,直接从缓存中获取资源,避免通过较长的链路回源。如果CDN缓存命中率低,则会导致源站压力大,静态资源访问效率低。因此,CDN缓存命中率的高低直接影响用户体验,而保证较高的缓存命中率也成为CDN的核心课题。可以针对导致CDN缓存命中率低的具体原因,选择对应的优化策略,优化CDN的缓存命中率,请参见提高CDN缓存命中率。我们可以通过CDN返回Response Header中的X-Cache字段来判断是否命中缓存。

image.png

说明
  • X-Cache:字段为MISS,则表示未命中缓存,需要进行回源处理;X-Cache字段为HIT,则表示命中了CDN缓存,会直接读取的缓存数据。

  • X-Swift-CacheTime:字段值表示CDN节点上的允许缓存时间,即该文件可以在CDN节点上缓存多久。如果是0,则表示该请求无法缓存。

缓存命中率低或频繁回源的现象和优化方案如下所示:

  • 首次访问会比直接访问源站还慢,因为第一次CDN节点没有缓存,需要先回源取数据。这种情况推荐使用预热URL功能,请参见刷新和预热资源,将源站的内容主动预热到CDN节点,用户首次访问可直接命中缓存,提高加载速度。

  • 资源访问量较低,文件热度不够,CDN收到请求较少,且无法有效命中缓存。CDN节点作为所有使用CDN的用户共用的节点资源,因此CDN配置的缓存规则表示该资源在CDN上的最长缓存时间。如果您的CDN加速域名流量较低,则可能提前从CDN节点的缓存中清除,即缓存按照热度属性采取末尾淘汰制。热度是指文件在节点上被访问的频率,当文件热度不够,则会被提前剔除。

  • 缓存配置不合理,缓存时间过短,CDN节点频繁回源的场景如下所示:

    • 当CDN未配置缓存规则时,如果静态文件未返回ETag和Last-modified响应头,则该静态文件不能缓存在CDN节点上。优化方案需要在源站配置这两个响应头,或者考虑在CDN侧配置缓存规则,请参见缓存配置

    • 当CDN未配置缓存规则时,CDN使用的是默认缓存策略,请参见阿里云默认缓存规则及优先级,缓存时间很短,最长不超过3600秒,因此容易造成频繁过期回源的情况,建议根据业务情况,在CDN侧设置合理的缓存时间。

    • 当源站配置了一些强制不缓存的Cache-Control的响应头时,即使您配置了缓存规则,CDN也不会对该资源进行缓存,因为这些响应头在CDN缓存规则中的优先级较高。若源站存在“s-maxage=0”、“max-age=0”、“no-cache”、“no-store”、“private”、“Pragma: no-cache”中的任一种规则,都会导致CDN无法缓存,需要在源站侧修改这些响应头。修改成Public等可以被缓存的响应头,详情请参见设置Nginx缓存策略设置Apache缓存策略

  • URL携带了可变参数 访问资源的URL携带了参数,并且参数不断变化。当使用不同的URL去访问CDN的时候,CDN会认为这是一个新请求(即便这两个不同的URL其实是访问同一个文件,并且该文件已经缓存在节点上),还是会回源拉取所请求的内容。这种情况下,建议开启过滤参数功能,请参见忽略参数

  • 大文件Range回源 对于一些大文件需要缓存的情况,建议开启Range回源功能优化回源,请参见配置Range回源

案例三:动态请求访问慢

如果访问慢的请求是一个动态请求,当客户端访问这些动态内容时,每次都需要访问用户的服务器,由服务器动态生成实时的数据并返回给客户端。这种场景下,CDN无法缓存实时变化的动态内容,因此CDN的缓存加速不适用于加速动态内容。对于动态内容请求,CDN节点只能转发回源站服务器,没有加速效果。如果用户的网站或App应用有较多动态内容,例如:需要对各种API接口进行加速,可以考虑以下方案。

  1. 源站做动静分离,静态资源使用CDN域名加速,动态请求使用另一个直接解析到源站的域名来访问。

  2. 考虑使用全站加速来加速动态请求,请参见全站加速。不过要注意的是,全站加速对于动态请求的加速是通过阿里云的路由优化、传输优化等动态加速技术,以最快的速度访问您的服务器源站获取数据,是一个四层链路的优化,如果源站服务器本身响应速度就很慢,那这种情况下还是需要优化源站。

案例四:源站响应慢

当请求访问慢时,若该请求是不缓存资源的请求,或者是一个动态请求,都是需要回源处理。但是由于源站的响应速度非常慢,导致最终响应的速度慢。该情况下可以直接在本地绑定源站域名访问源站,或者在源站服务器中测试源站域名的响应速度。导致该情况出现的原因如下所示:

  • 源站性能限制,本身处理速度比较慢,例如源站的带宽、CPU等达到瓶颈,或者源站程序处理速度慢等,需要考虑优化源站。如果性能不足,则需要对源站扩容。

  • 源站的网络比较差,或者源站涉及跨境链路,比如用户请求中国内地的CDN节点,而源站在中国内地外。由于CDN回源到源站的链路也是公网地址,如果涉及到跨境链路的话确实会受到一些影响,因为跨境链路涉及到不同的运营商、境外运营商,而且需要走国际互联网出口,这些情况CDN侧和源站侧都不可控,CDN单方面优化的空间很小,建议部署双源站(境外和境内)调整架构进行优化。

案例五:网站首页加载慢

当客户端访问http://www.example.com/网站时,浏览器会请求该首页,请求成功以后,服务端返回HTML代码给浏览器,然后浏览器再根据返回的HTML代码来请求代码中需要引入的一些资源,例如图片、JS、CSS等这些URL。如果首页是一个动态资源或者是不需要缓存的资源,则会导致每次请求首页时,CDN都会经过回源处理。如果源站响应慢就会最终导致首页加载慢,该请求在Network中的Pending状态持续时间比较久。具体是否命中缓存可以参见案例二:缓存命中率低或频繁回源的介绍。

这种首页不缓存且请求访问慢的场景,造成的现象就是首页请求一直为Pending,等首页请求到数据后,静态资源很快都会加载出来。

案例六:网站加载的资源比较大

如果网站加载的资源比较大,可以通过设置加速域名的性能优化功能,请参见性能优化,缩小访问文件的体积,提升加速效率和页面可读性。目前智能压缩支持的内容格式:text/html、text/xml、text/plain、text/css、application/javascript、application/x-javascript、application/rss+xml、text/javascript、image/tiff、image/svg+xml、application/json、application/xmltext。

案例七:某地区某运营商用户访问慢

有一些问题场景,客户端存在共性。比如:某一个时间段,某市移动用户有大量用户反馈访问慢或者异常,而联通电信用户都正常。这类问题很有可能跟当地运营商网络或者该地区请求到的CDN节点有关联,通常的排查方法就是在用户侧去搜集ping信息,先确认客户端和CDN节点之间的网络延迟情况。

另外根据用户请求到的CDN节点IP,可以绑定到该CDN节点进行测试,测试方法跟绑定到源站去测试类似,将IP地址转换成CDN节点的IP即可。绑定节点测试前,可以先验证该节点本身是否存在响应慢的情况。如果响应慢,再查看该请求是否命中缓存、加载的资源是否过大,结合前面的案例进一步分析。如果无法定位问题,可以通过提交工单等方式联系阿里云。

适用于

  • CDN

  • 全站加速