写点什么

优化 CDN,从全链路入手

  • 2019-09-12
  • 本文字数:2475 字

    阅读完需:约 8 分钟

优化CDN,从全链路入手

CDN 是一种新型网络构建方式,目的是提高用户访问响应速度和准确率。CDN 代表了一种基于质量与秩序的网络服务模式。本文将从技术角度探讨 CDN 的应用前景,同时结合实际场景中的问题和解决办法,希望能够帮助企业更好的用好网络,服务用户。


今天,我们来介绍下 CDN 优化的核心要点和关键环节。

质量与规模均是业内领先

百度智能云 CDN 自 2016 年开始对外商业化,搭上百度智能云发展的快车道,不断打磨与改进,目前储备带宽近 100T,全球可用节点近 1000 个,拥有国内与海外完整的加速解决方案,CDN 的规模与质量都得到了大幅提升。



百度智能云 CDN 架构与优势


当前,百度智能云 CDN 的主要特点如下:


  • 边缘 CDN 节点支持 QUIC、HTTP2.0、TLS1.3 等新特性。

  • 节点内部支持私有协议,主要用于节点间加速与内部回源防劫持。

  • 上传加速,节点间使用 QUIC、长连接复用等技术打造上传加速差异。

  • 中心节点与百度内网有高速专线连接,总体利用率不到 40%。

  • 与 BOS(对象存储)结合,有一套完整的上传与分发解决方案。


由于百度智能云的 CDN 表现出色,不少重量级的企业已经在使用。例如,我们服务的长视频类客户主要有爱奇艺、芒果点播等,短视频类客户主要有快手、手百 Feed、全民视频、好看视频等,手机 APP 下载类客户有魅族、小米、华为等。

从全链路入手进行优化

如何做到 CDN 的优化?我们从全链路分析着手,涉及到客户端、网络、节点和回源整个请求的生命周期。


就拿手机百度 APP 的 Feed 小视频来说,当用户点击一个视频后,一个 HTTPS 请求会从端上触发,经历端上 APP 及播放器再到底层网络协议栈发出,再通过公网途经就近 CDN 网络,首次未命中回源获取,同步响应第一个用户。在 CDN 上缓存后,便能加速后续的请求。从这个过程来看,一个请求的生命周期大概经过以下阶段。


1 客户端:需要不同调整策略

端上的数据往往是我们优化的突破点,因端上 APP 实现逻辑的差异,不同的实现形式可能需要服务端有不同的对应调整。HTTPS 现在基本是端上的标配,有效的 HTTPS Session 复用能大大提升加载资源的速度,手机百度 APP 通过多种 Session 复用技术,可以做到 0-1RTT 的时延。


我们团队与手机百度网络团队联合优化时发现,手机百度端上网络库存在以目标 IP 为粒度的 Session 复用,虽说这样能大幅度提升 Session 复用率,但在目前以 SNI 为基石的多域名复用 CDN 加速机制下,会出现握手失败的情况,最后通过端上网络库的打点,我们能及时发现并解决问题。


另外,我们还结合端上的卡顿分析,发现 4G 网络用户因受运营端套餐的限制,会出现每月从 1 号开始,卡顿比或 loading 率持续上升,再到次月初恢复的现象。

2 网络:注意域名解析

在发请求前,域名解析是一个必不可少的环节,大部分端会首先用 DNS 来解析,但国内的 DNS 劫持与污染一直是非常严重的问题。我们给用户建议使用 HTTP DNS 后有效解决了劫持问题。例如,在某些弱网络环境下,手机百度 APP 端上会自动升级到 QUIC 协议,主动改善用户体验。

3CDN 节点:分层优化

节点内的优化一直是我们的重点,优良架构的选型与核心模块的优化都有显著的效果。百度智能云 CDN 采用典型的分层结构,接入业务层与 Cache 存储层分离,各自分工明确,通过四层 BGW 加七层 Nginx 的两层负载,应对各种故障场景。


CDN 节点上内核协议栈的行为,对性能有很大的影响,如初始窗口、发包策略、重传策略等,我们线上内核大量尝试 BBR、Boost 等较为先进的发包算法,有效提升传输速度与可用性。


另外,协议栈层面,我们还自研了一套系统,能自定义监控一条 TCP 流上所有的形为,这样就能有效快速的定位到应用层数据发完后,是协议栈没有及时处理还是端上网络不好。

4 回源:用私有协议应对劫持

回源劫持一直是比较头疼的问题,如 302 劫持、DNS 劫持等。比较有技术含量的运营商能根据 Host 进行阻断,可能是为了减少跨网流量或主动封堵。此问题可以用 HTTPS 得到有效解决。但 HTTPS 就会要求用户必须提供有效的证书,且存在大量的 SSL 握手,在节点内部回源,就显得有点太重。


为此我们开发了一套私有回源协议,尽量使问题简单有效的得到解决。另外,如果使用百度智能云的 BOS 存储,还会有额外的优化,如高速专线回源、独享公网带宽、常态有 40%的允余,足以应对各种突发。

重点优化 Nginx 接入层

为了能有效的衡量七层接入层 Nginx 的优化效果,我们团队构建了一个能体现 Nginx 运行状况的卡顿指标,具体为 Nginx 每分钟处理事件 cycle 时间超过 50ms(50ms 的选择是可配置的,主要是考虑优化影响较大的场景)的个数。



一次处理 cycle 超过 50ms 意味着这个 Nginx worker 上的所有请求,都会在这个时间段(50ms 内)得不到及时的处理。就小文件场景来说,就会体现在首包时间长,而我们的优化往往就是毫秒级进行。对于 Nginx 这样一个高效的异步事件驱动的模型来说,这有背于高并发设计原则,我们应该全力降低并消除回调 callback 过于占用 CPU 的情况。通过我们线上的实践,大体发现两类问题。

1 智能压缩减少 CPU 消耗

这个问题大家都比较容易理解,压缩本来是一个 CPU 密集性任务。为了有效降低 CDN 的出口带宽,部分文件类型的压缩是不可少的。但我们也发现,有部分用户的文件类型,压缩比很低,这类基本没有压缩的必要,所以我们 CDN 支持了智能压缩,自动计算与识别压缩比,来决定压缩与否。

2 解决系统调用卡顿

系统 writev 调用卡顿,是我们逐步缩小定位到的,发现线上机器因内存使用不当,产生大量的内存碎片,而每次 writev 调用时,在申请内存不够时,会时不时的触发 reclaim 或 compaction。经过与内核同学一起定位,通过修改内核行为得到有效解决。


经过以上调整之后,收益明显:可以做到小文件首包降低 30ms+,与多家竞品对齐或超越;同时,每分钟事件处理超过 50ms 的卡顿数降低 90%(从每分钟 40 次到每分钟 4 次)。

总结

本文主要介绍了百度智能云 CDN 优化的核心要点和关键环节,后续将持续撰写相关文章,敬请关注。您可以通过后台或者直接在文末留言,共同讨论如何让 CDN 更快、更稳、更安全。


本文转载自公众号 AIOps 智能运维(ID:AI_Ops)。


原文链接:


https://mp.weixin.qq.com/s/NGeO6aGOedq_mQ6rwaNtCg


2019-09-12 00:162459

评论

发布
暂无评论
发现更多内容

千万别踩坑,一面就凉透!Java,java语言程序设计基础篇第十一版答案

Java 程序员 后端

历时半个多月,支付宝3面+美团4面,基础+进阶+高级

Java 程序员 后端

双非本科怎么了,照样拿到阿里 offer! 分享阿里技术四面 + 交叉面

Java 程序员 后端

反正闲的也是闲的,搞点Redis面试真题,再也不担心挂在Redis上

Java 程序员 后端

可视化编程已经能取代高级语言了吗?,docker高级面试题

Java 程序员 后端

十个超酷的java谋生方式,你喜欢吗?,linux网络编程书籍

Java 程序员 后端

前端同事老是说swagger不好用,我用了knife4j后,同事爽得不行

Java 程序员 后端

又是一些小细节!3面成功入职字节跳动:算法,数据库mysql教程视频教程

Java 程序员 后端

双非本科毕业的我,为何能在金九银十期间斩获京东、字节

Java 程序员 后端

史上最全 SpringCloud入门教程,从零开始带你深入♂学习(十

Java 程序员 后端

初来乍到,IT职场人,有些黑话要先了解,太牛了

Java 程序员 后端

加班2个月,肛出最强干货之“Spring全家桶,rabbitmq消息队列原理

Java 程序员 后端

压箱底的干货!干货!,多线程面试题目

Java 程序员 后端

可爱的程序员哟,你忘掉的是这堆Java锁呢?还是这把死锁呢

Java 程序员 后端

制作Docker镜像,用来下载OpenJDK11源码,分享一点面试小经验

Java 程序员 后端

卧槽,牛皮了!某程序员苦刷这两份算法PDF47天,java大神需要掌握的技术

Java 程序员 后端

十月一奉上九大核心专题,630页内容,祝你收割大厂offer

Java 程序员 后端

前端必备 Nginx 配置,kafka原理解析

Java 程序员 后端

千万级电商项目从0到1到100全过程 涵盖Java程序员不同成长阶段的问题及优选解决方案!

Java 程序员 后端

删了HDFS又能怎样?记一次删库不跑路事件,kafka的架构图

Java 程序员 后端

制作JavaCV应用依赖的基础Docker镜像(CentOS7+JDK8+OpenCV4)

Java 程序员 后端

单机下如何让Java程序支持百万长连接,你知道吗?,云计算架构师认证

Java 程序员 后端

怎样实现跨微服务的数据查询?

俞凡

架构 微服务

史上最全141道大数据面试题:Redis+Linux,mongodb面试

Java 程序员 后端

史上最全499道Java面试题:JVM+分布式,Kafka的精髓全写这本“限量笔记”里了

Java 程序员 后端

初来乍到,IT职场人,有些黑话要先了解(1),springboot定时任务注解原理

Java 程序员 后端

前端向后端进发之----Springboot JPA增删改查,外包Java后端开发三年

Java 程序员 后端

力荐:提高千倍效率的一些 Java 代码小技巧,java语言程序设计教程朱晓龙课后答案

Java 程序员 后端

华为架构师亲手操刀,世界五百强都在用的kafka也就那么回事

Java 程序员 后端

又是一年金九银十,不明白JVM虚拟机还怎么面试-,kafka部署架构

Java 程序员 后端

初识动态规划,java程序设计教程第三版机械工业出版社

Java 程序员 后端

优化CDN,从全链路入手_文化 & 方法_吴永强_InfoQ精选文章