NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

B 站小电视全链路性能和效率优化实践

郭利兵

  • 2023-12-04
    北京
  • 本文字数:4573 字

    阅读完需:约 15 分钟

大小:2.37M时长:13:47
B 站小电视全链路性能和效率优化实践

在 2023 年 12 月 28-29 日举办的 QCon 软件开发大会上,我们邀请到了 bilibili 多屏业务部 / 资深工程师郭利兵老师来 QCon 大会上分享《云视听小电视性能和效率优化实践》话题,在正式演讲之前,我们专门策划这篇文章,介绍郭老师团队在这方面的经验,提前预告话题的重点内容。

小电视介绍


首先介绍下小电视,小电视的全称是云视听小电视,就是 bilibili 的电视版,如下图,可以在电视观刷 B 站视频。



优化背景


首先我们为什么要做性能优化呢?那肯定是我们的性能还不够极致,和业界标杆对比还有差距;为什么我们要做效率优化呢?在降本增效的大背景,降低成本,提升效率是每个互联网公司的必修课。今天的主要和大家分享下我们在过去一年对小电视的全链路的优化实践,包括客户端,后端以及 CDN 相关的优化思路和优化成果,我将从以下几个方面进行分享:


  1. 目标拆解

  2. 小电视性能和效率优化落地实践

  3. 优化效果

  4. 实践方法总结

目标拆解

3.1 确定指标


那么到底要优化成什么样呢?这是我们启动优化的第一步,明确优化目标。

3.1.1 性能指标


从用户的角度来看,我们的性能目标就是快而且流畅,具体多快,怎么流畅,有哪些指标可以衡量呢?


  • 启动快,从点击 App 到 App 首页加载完成的时间要快,否则影响用户体验。

  • 起播快,从点击视频的播放按钮到首帧起播的时间要快。

  • 卡顿少,播放过程中流畅无卡顿。


性能优化的目标有了,具体指标怎么定呢,结合小电视当前的性能现状,参考业界的标杆,制定了如下目标:


  • 启动时长:从 4 秒降低 3s 以内。

  • 首帧起播时间:TP 90 1400ms-->TP 90 1000ms 以内

  • 卡顿率:单位时间内的卡顿次数 / 播放 vv 数,0.012 降低至 0.008 以内

3.1.2 效率指标


效率优化的目标是什么呢?简单说就是省钱,小电视的最大成本就是带宽成本,省钱重点重带宽成本入手,业界通用的衡量指标是单 DAU 的带宽成本。


  • 月均单 dau 的带宽成本:从 1.2 元降低至 1 元以内。

3.2 梳理链路


定完目标之后,接下来就是链路梳理,了解当前的数据流向,才能针对性的做优化,如下是多屏的全链路数据流,用户启动到浏览,到播放,播放会经过 CDN 再从 CDN 到源站,性能上我们希望启动,浏览和起播要快,效率上我们希望要省,如何省呢,接下来我们从启动,播放和 CDN 这些方面来拆解目标。



3.3 目标拆解


目标明确之后,结合我们的数据链路,接下来我们把目标拆解成一个个可落地执行的小目标,首先是启动时长的拆解。

3.3.1 性能指标拆解

3.3.1.1 App 启动时长


首先我们需要分享小电视启动耗时都花在哪儿,才能针对性的做优化,如图 App 启动时主要分任务加载和首页加载两部分,那我们可以分别从这两方面进行优化,将启动视时长的目标拆解成客户端和后端两部分,共同达成启动时长降低 3 秒内的目标。


  • 客户端优化后降低 600ms。

  • 服务端优化后降低 400ms。


3.3.1.2 首帧起播时长


首帧起播时长主要由以下三部分耗时组成,我们将起播时长优化目标拆解如下:


  • 提升后端播放流地址查询接口的性能,TP90 降低 100ms

  • 优化首帧加载的网络耗时。

  • 优化解码的耗时。


3.3.1.3 播放卡顿率


分析卡顿率的来源如下,针对这些原因,我们将目标拆解为:


  • 降低网络波动的影响。

  • 优化低端机型的卡顿率。

  • 降低 CDN 不稳定的影响。


3.3.2 效率指标拆解


性能指标拆解完了,接下来我们拆解效率指标,我们上面说了提效对于我们当前阶段来说,就是节省带宽成本,带宽成本每月在千万 +,节省带宽成本同时不能降低 DAU,还得保持业务的增长,只能降低单位带宽成本。


3.3.2.1 单 DAU 带宽成本


哪些因素会影响单位带宽成本呢?如图是影响 DAU 成本的关键因素,根据这些关键因素我们把目标拆解如下:


  • 优化 CDN 的成本,提高廉价 CDN 的使用率。

  • 降低无效播放,识别黑产,从而降低带宽成本。

  • 提高码率的利用率,在保证画质的前提下,提升编码效率,降低单 vv 的码率。


性能优化实践

4.1 App 启动时长优化

4.1.1 客户端优化


App 启动时长优化常用的策略有延迟加载,合并任务,串行改并行等,我们也不例外,但是在具体执行优化之前,我们梳理了当前启动的所有任务



  • 串行改并行,并行化并不是无脑将所有任务都改成并行,启动任务之间有很多依赖关系,我们在梳理完依赖关系之后,使用有向无环图 -DAG,画出了任务关系图如下:按照这个顺序来启动小电视,避免改变现有的执行逻辑。


  • 延迟加载,启动过程中,有很多耗时的任务可以放到首页加载完毕之后再进行,以此来降低启动时长,我们梳理出长链任务,日志任务,菜单拉取任务等可以延后加载,不影响用户体验。

  • 合并任务,将部分进程合并,避免过多进程影响启动时长,实际操作中,我们将投屏、埋点和主进程合并,来提升启动效率。

4.1.2 服务端优化


首先我们得梳理启动过程中调用哪些服务端接口,经过梳理从 App 启动到用户首页加载完成,调用了 20+ 个后端接口,耗时最高的几个接口为:首页推荐接口用户的个性化接口以及分区接口,这三个接口 TP 90 都在 200ms 以上,其中推荐接口 TP 90 在 500ms+,所以我们重点优化这几个接口的性能,主要的思路如下:


  • 缓存优化,推荐接口中包含大量的热点稿件,我们用了两级缓存,一级缓存使用本地缓存,本地缓存中没有再回源至 redis 换成,redis 没有再回源至 MySQL。


  • 数据压缩,主要通过更新 HTTP 协议至 RPC 协议,feed 接口的数据量返回很大在 200k 左右,切换至 RPC 协议支持单次返回的数据量能压缩至 150k 左右,这能减少客户端序列化以及传输压力,性能提高了 5%。

  • 接口拆分,通过日志工具分析接口的调用链路,发现存在大量的无效调用,主要原因是存在很大大而全的接口,一次返回太多冗余信息,我们将这些大接口进行拆分,针对起播时的推荐场景定制小而美的依赖接口,如何优雅的拆分呢,我们使用了 Builder 构造器模式,如图是我们的稿件查询接口的拆分,通过编排构造器,来返回不同的信息,避免返回大而全,造成数据冗余。


4.2 首帧起播时长优化


  • 链接复用,客户端拿到播放地址之后需要和 CDN 建立连接,为了避免每次播放都去建连,我们提前和 CDN 建立多个链接,播放时直接服用这些链接,降低链接耗时。

  • 解码器复用,由于小电视的首页默认是 feed 流,存在大量两连续自动播放,如果播放每一个视频都重新初始化解码器,存在大量重复初始化,这里我们使用了 codec_pool 进行相关解码器的复用,在上一个视频完成播放时,我们把相关的 codec 复用到下一个视频。

  • 预加载,针对连播场景就是提前下载视频数据的一部分,来达到快速起播的效果,那具体什么时候预加载,预加载多少呢,在当前播放视频已经加载结束的情况,提前加载下一个视频的部分内容,根据设备的配置以及网络情况动态调整预加载的大小。

4.3 卡顿率优化


  • 动态缓存方案:在网络较好的情况下,可以增加缓存以提高播放的平滑性;而在网络较差的情况下,可以适度减小缓存,以减少启动时间和降低卡顿风险。

  • Backup URL 方案:通过备用 CDN 兜底 Base CDN 异常情况,在视频播放过程中,定期检测当前源的状态,如果检测到播放问题(例如卡顿、缓冲过长等),系统可以自动触发切换到备用源。(互备)

  • 自适应码率方案:在视频播放过程中,根据网络带宽的变化,动态选择适应当前带宽的视频码率。如果网络速度较慢,可以降低视频质量,减小卡顿的可能性。(网上看下细节)

  • 4K 回源路径缩短:4k 视频本质上是冷资源,直接按原有 CDN 回源流程耗时太长,卡顿能达到 5% 以上,对于这种冷资源,我们将其直接放到阿里聚边,通过中央存储 + 边缘 POP 点,加速冷资源获取,卡顿迅速降低到了 1.5% 左右。


效率优化实践


谈到效率优化,一方面是降低成本,另一方是提升单位成本的效率,降本方面我们主要通过降低带宽成本,主要是优化 CDN 的带宽成本,效率方面我们通过算法来优化码率和画质,先看看我们 CDN 降本的工作。

5.1 CDN 成本优化



上图是我们的视频播放请求路径,用户请求先到边缘节点,边缘节点如果没数据回源到源站,这里有两部分成本用户请求 CDN 产生的带宽成本以及,CDN 回源产生的带宽成本,这也是视频网站成本的大头,我们调研了下回源带宽的成本没有太大空间,但是用户到 CDN 的成本可是挖掘挖掘,如下策略。


  • PCDN 使用,如下图由于 PCDN 的价格比 CDN 便宜很多,针对小电视场景,我们联合 CDN 调度团队提高了 PCDN 的使用率占比,通过监控网速、码率、剩余视频缓存等多个因素,动态的权衡什么时候用廉价 CDN,什么时候用商业 CDN,在保证播放质量的前提下尽可能的多用廉价 CDN,目前小电视的廉价 CDN 使用率已经达到 85%。



  • 削峰降低带宽 95 峰值,由于带宽的计费规则是按照日 95 峰值来计算,我们在低峰期加大预加载的量,在高峰期降低高峰期的预加载量,依次来降低 95 峰值的带宽用量。

  • 优化清晰度策略,在不影响用户体验的情况下,有如下策略:


不同机型使用不同默认清晰度低端机型默认使用较低的清晰度,一方面低端机型播放高清视频存在卡顿,另一方面也能降低响应的 VV 码率从而减低带宽成本。

针对不同用户使用不同默认清晰度登录用户默认较高清晰度,一来提供用户登录率,二来降低默认视频的播放码率。

投屏清晰度调整,投屏到第三方清晰度调整成 720p,一来是提高小电视的 DAU,二来也降低带宽成本。


  • 识别黑产,通过分析请求的特征信息包括 user-agent,入参信息,请求 IP 来源等,进行针对性阻断,从而降低黑产带来的带宽成本。


5.2 码率增强优化

5.2.1 降码率


视频码率是指视频文件在单位时间内的数据传输速率,也叫比特率 (bits per second,bps),降低码率也就是降低单位时间内的数据传输大小,这不会影响视频质量吗?我们要做的就是如何通过降低单位时间内的传输数据同时还能保证不影响视频清晰度,如何做的呢,主要是通过视频压缩,使用先进的视频压缩算法,比如阿里窄带高清的算法,以及 bilibili 自研的 bilihevc 算法对视频进行编码优化

5.2.2 提画质


联合视频云团队通过增强算法提升 1080P、4K 的画质,主要通过 HDR 技术以及局部增强等技术,如下图同样是 1080p,增强后效果显著。


成果 & 总结

6.1 成果


经过半年的优化主要成果如下:


  • 启动时长,从 4.2 秒降低至 2.9 秒

  • 播放卡顿率,从 1.2% 降低至 0.56%

  • 首帧起播时长,从 1400ms 降低至 900ms

  • 带宽成本,每月 / 单 DAU 带宽成本 1.05 降低至 0.81, 半年节省带宽成本千万 +

6.2 总结


在做性能和效率优化时,首先要明确目标,确定指标,梳理数据链路,寻找可优化点,再把指标拆分到每一个链路上,总能在看似无能为力的地方挖掘新的突破点。


嘉宾介绍


郭利兵:毕业于大连理工大学,9 年互联网海量系统研发经历,参与过美团点评团购券系统的搭建和治理,哔哩哔哩多屏后端系统的领域拆分和微服务化,同时在稳定性治理上有较多实践。

活动推荐


收官之战!2023 年最后一场会议——QCon 全球软件开发大会·上海站,将于 12 月 28-29 日在上海·中优城市万豪酒店举办。


此次大会策划了 GenAI 和通用大模型应用探索、AI Agent 与行业融合应用的前景、LLM 时代的性能优化、智能化信创软件 IDE、LLM 时代的大前端技术、高性能网关设计、面向人工智能时代的架构、构建本土编程语言生态的实践、性能工程:提升效率和创新的新方法、LLM 推理加速和大规模服务、现代数据架构演进、建设弹性组织的经验传递、SaaS 云服务弹性架构设计、大模型研究进展与产业应用展望等专题。



大会现已进入 9 折优惠报名,现在购票立减 ¥680。咨询购票可联系票务经理 18514549229(微信同手机号)。更多大会相关资讯可扫码上方二维码了解,或点击「阅读原文」即可查看,12 月,我们上海见!

2023-12-04 15:205770
用户头像

发布了 163 篇内容, 共 71.9 次阅读, 收获喜欢 198 次。

关注

评论

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

模块一作业

zjluoyue

软件架构设计原则之合成复用原则

Tom弹架构

Java 架构 设计模式 设计原则

10分钟搞懂事件驱动API

俞凡

架构 API

Vue进阶(幺肆玖):template 标签

No Silver Bullet

Vue 模板 占位符 10月月更

电商微服务拆分

白开水又一杯

#架构实战营

电商系统微服务拆分

michael

架构实战营

【架构实战营作业】模块六——创业公司电商微服务架构

聆息

026云原生之Exporter采集数据

穿过生命散发芬芳

云原生 10月月更

学习心得 - 架构训练营 - 第六课

Fm

linux删除目录下文件的几种方法

入门小站

Liunx

模块一作业

hhh

「架构实战营」

学生管理系统

Mars

架构实战营 模块一

什么是架构

天天向上

架构实战营

这样学BAT必面之软件设计原则,还不会就是我的问题

Tom弹架构

Java 架构 面试 设计模式 设计原则

HMS的舞者们,在智能世界的舞台

脑极体

模块六作业

potti

web安全:mysql提权总结篇

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

架构实战营 拆分电商系统为微服务

💤 ZZzz💤

架构实战营

软件架构设计原则之接口隔离原则

Tom弹架构

Java 架构 设计模式 设计原则

软件架构设计原则之迪米特法则

Tom弹架构

Java 架构 设计模式 设计原则

软件架构设计原则之里氏替换原则

Tom弹架构

Java 架构 设计模式 设计原则

架构实战营总结

gawaine

架构实战营

Redis 实现分布式锁

黄敏

腾讯云安全隐私计算通过 CFCA 评测,再获国家级认可

腾讯云大数据

大数据 隐私计算

拆分电商系统为微服务

缘分呐

微服务 电商系统

学生管理系统架构设计

天天向上

架构实战营

架构实战营-第三期-模块一作业

岚哲

极客时间 架构 架构实战营

ZK(ZooKeeper)分布式锁实现

牧小农

zookeeper ZooKeeper原理 zookeeper分布式锁

模块6作业

4anonymous

随便谈一下kafka消息队列

Regan Yue

kafka 10月月更

指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计

腾讯云大数据

大数据 流计算 Oceanus

B 站小电视全链路性能和效率优化实践_大数据_InfoQ精选文章