如何优化淘宝直播 PC 推流端性能(上)

简介: 如何优化淘宝直播 PC 推流端性能(上)




于 Electron 的淘宝直播 PC 推流端已经上线一年多,期间迭代了很多功能,应用也越来越庞大。自上线以来也收到一些用户反馈应用启动慢、打开推流页面慢、运行过程页面交互操作卡、推流画面卡、CPU 占用过高等性能问题。针对这些问题,我们要怎么优化呢?



背景


在开始讨论优化之前,我们先来了解下 Electron 是一个使用 JavaScript、HTML 和 CSS 构建 Windows、MacOS、Linux 跨平台的桌面应用程序的框架,嵌入了 Chromium、Node.js 和 Native API:


由于 Electron 集成了 Chromium,因此天然支持多进程架构。当淘宝直播 PC 推流端运行起来后,通过查看任务管理器就可以知道除主进程、Utility、GPU 进程外,每新建一个页面窗口就会多一个 renderer 进程,如下图所示:

而我们实测也发现也只有推流页面所在 renderer 进程最耗费性能,其中推流 C++ SDK 也运行在该 renderer 进程里。因此,我们接下来主要讨论的是推流页面 renderer 进程是如何优化性能的。


如何优化淘宝直播 PC 推流端性能



 启动耗时优化


  • 应用启动耗时优化


当我们双击打开淘宝直播 PC 推流端应用时,需要初始化一系列的逻辑(如设置缓存、登录所需环境、创建目录、检测内网环境创建系统设置菜单、启动本地服务、初始化 IPC、创建首页、预热推流页面等),整体可交互耗时需要 10s 左右,体验不是很好,用户满意度方面很差。因此,我们进行了一轮优化:

  1. 启动流程优化
    检测内网环境创建系统设置菜单优化:请求接口获取是否内网环境比较耗时,同步改为异步
    electron log 日志输出优化:涉及 IO 操作,多条合并为一条
    electron store 删除及设置优化:涉及 IO 操作,多条合并为一条
    删除本地过期目录及杀掉残留独立进程优化:启动执行改为退出时执行
    创建首页窗口流程优化:首页显示后再执行预热推流页面逻辑
  2. 包体积压缩优化
    使用 webpack 配合插件 loader 将 js、css 等资源进行压缩,并通过抽离公共模块,整个 asar 大小从 18M 压缩至 2.5M 左右。这样可以提升 js 加载速度。
  3. V8 code cache
    V8 代码提前编译并进行缓存,等加载执行时速度就快很多了。不过由于 Node.js 启动流程已经针对内置模块的 V8 代码进行编译并缓存了,因此项目中设置也没收益。

经过以上优化后,应用启动耗时从 10s 降低到 2.5s。


  • 推流页面启动耗时优化


淘宝直播 PC 推流端刚上线时,从首页进入推流页面需要经过数据加载(如通过请求获取直播间配置等数据)、初始化 SDK(C++ 推流 SDK)、页面渲染等流程,整体可交互耗时需要 5s 以上,核心页面 loading 时间比较长:


于是我们进行了一轮优化,通过数据预加载(首页提前加载推流页面数据)、减少 SDK 的初始化耗时(把非关键路径代码改为异步执行),从首页进入推流页面从 5s 以上降至 2s 左右:


但经过优化后还是没有达到秒开效果,主要原因是初始化 SDK 比较耗时,那有人会问为啥 SDK 不能在首页提前初始化呢?这是因为首页和推流页面都运行在各自的 render 进程里,如果要在首页提前初始化 SDK 的话,就得把 SDK 对象传给推流页面进程,而进程间通信传不了对象,因此该方案行不通。


那还有没其他方案呢?其实我们可以参考预加载的能力,将推流页面进行预热,这样就可以做到提前初始化 SDK 了。通过预热方案后,从首页进入推流页面只需要将隐藏的推流窗口进行显示就行,整体耗时在 50 ms,实现秒开效果。



 运行时性能优化


前面优化完核心页面启动耗时后,接下来我们重点介绍如何优化运行时性能。

在做运行时性能优化之前,我们先想一想一个 Electron 应用到底哪里会有性能问题?就拿淘宝直播 PC 推流端为例,我们需要对整个应用进行性能摸底测试,才能知道哪些模块会有性能问题。因此,我们开发了一个性能测试工具,可以分别对前端和 SDK 模块进行单测:


其中测试指标包括 CPU、单帧耗时、渲染输出帧率、GPU、内存、页面帧率、页面卡顿率等,而我们最关心的 CPU 是通过系统 api 获取(对齐业界通用的 ProcessExplorer 三方测试工具),需要在锁频情况下进行测试,CPU 锁频脚本如下:

@echo off

set key1=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\intelppm
set key2=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Processor
set value=start
set newvalue=4

reg add "%key1%" /v "%value%" /t REG_DWORD /d %newvalue% /f >nul 2>&1
if %errorlevel% equ 0 (
    echo Successfully changed %key1%\%value% to %newvalue%
) else (
    echo Failed to change %key1%\%value% to %newvalue%
)

reg add "%key2%" /v "%value%" /t REG_DWORD /d %newvalue% /f >nul 2>&1
if %errorlevel% equ 0 (
    echo Successfully changed %key2%\%value% to %newvalue%
) else (
    echo Failed to change %key2%\%value% to %newvalue%
)
pause


通过使用性能测试工具进行摸底测试,我们发现了一些模块的性能问题,如轮询请求、baxia、纯净流、端智能、美颜、推流等模块。下面分别从前端和客户端的视角进行性能优化介绍。

  • 前端页面性能优化


由于 Electron 集成了 Chromium 内核,因此 Electron 应用的前端页面也可以用 performance 面板来分析性能问题,并进行性能优化。


场景元素操作耗时优化


当我们推纯净流时,推流页面创建的场景元素越多导致操作耗时越长。通过 performance 面板录制后分析发现会重复调用 DuplicateSource NAPI 接口,而该接口调用一次需要花费 100 ms ~ 500 ms。



因此,针对纯净流场景进行性能优化,当场景元素变换时只 copy 变更的元素,将 DuplicateSource 接口调用次数降为 1 次,且不会随着场景元素的增加而增加,经测试发现场景中有 50 个元素时操作耗时从 30s 降为 1s。


baxia 安全逻辑耗时优化


在性能摸底测试时,发现 PM 消息推送过程存在 CPU 间隔性飙升的情况:


一开始怀疑是 PM 解析消息时消耗 CPU,但通过 performance 面板录制后(下图左侧是长任务,右侧是各个 js 耗时占比),分析原因发现是 baxia 引入的 fireye.js 里调用的 getFYToken 接口(采集底层及硬件信息)非常消耗性能。



那为啥是 PM 消息推送时会有这个性能问题呢?原来是因为 PM SDK 也用到了 baxia 的 fireye.js 脚本(AWSC),而该脚本是为了防爬、防刷、人机等安全能力。

由于我们应用接的 baxia 并没有使用到 AWSC,评估后可以将相关耗时(采集底层及硬件信息)接口函数置空即可:


(window as any).AWSC = { use: () => {}, configFYEx: () => {} }


经过处理后,baxia 模块耗时占比只有 0.5%,而且 CPU 使用率非常平稳,不再有飙升情况:

  • 客户端性能优化


前面所介绍到的是以前端视角进行性能优化的,那客户端有没像 performance 类似的性能分析工具呢?常用的主要是 Visual Studio 和 Windows Performance Analyzer。


Visual Studio:除了用来日常开发外,调试面板还有个性能分析器功能,可用于帮助开发者分析和优化程序的性能。但是测试发现将 pdb 调试符号映射上后也只能解析出系统动态库及 electron 框架自身的代码,无法进一步解析出应用业务模块代码。


了解完客户端常用性能分析工具后,我们就可以利用这些工具进行性能优化。由于我不直接参与客户端底层的性能优化,只是从应用层面配合优化,因此我只是介绍下整个应用经过一轮性能优化后,大盘 CPU 超过 65% 的直播场次占比从 13% -> 6.7%,工程侧 CPU 占比从 34.5% 降为 9.4%

  • 前处理切独显渲染
  • 电脑配置较差时美颜相关算法策略调整
  • 采集输入帧率及输出帧率优化
  • 端智能智能看点下线及安全相关算法频次调整
  • 纯净流默认策略调整
  • ARTC 日志优化
  • 推流低帧率治理及 264 ultrafast
  • ......



如何优化淘宝直播 PC 推流端性能(下):https://developer.aliyun.com/article/1480498

目录
相关文章
|
18天前
|
Web App开发 监控 前端开发
如何优化淘宝直播 PC 推流端性能(下)
如何优化淘宝直播 PC 推流端性能(下)
28 2
|
4月前
|
存储 弹性计算 关系型数据库
100W用户、8000W流量在线贺卡应用架构如何优化?
100W用户、8000W流量在线贺卡应用架构如何优化?
|
9月前
|
视频直播 芯片 异构计算
山东布谷科技直播系统源码热点分析:不同芯片实现高质量编码与渲染视频的GPU加速功能
总而言之,对于直播系统源码来说,GPU加速功能是提升实时图像质量和观看体验的重要手段,是不可或缺的重要功能技术之一。
山东布谷科技直播系统源码热点分析:不同芯片实现高质量编码与渲染视频的GPU加速功能
《QQ 空间百亿级流量的社交广告系统海量实践》电子版地址
QQ 空间百亿级流量的社交广告系统海量实践
48 0
《QQ 空间百亿级流量的社交广告系统海量实践》电子版地址
《QQ空间平台百亿级流量广告系统海量服务实践》电子版地址
QQ空间平台百亿级流量广告系统海量服务实践
56 0
《QQ空间平台百亿级流量广告系统海量服务实践》电子版地址
|
搜索推荐 UED
短视频开发app,哪些功能可以加速平台盈利?
短视频开发app,哪些功能可以加速平台盈利?
|
Web App开发 设计模式 缓存
新工具开源!一款双11养猫5亿用户的互动引擎(附地址)
阿里巴巴历时2年自研开发的互动游戏引擎Eva.js正式开源,致力于让前端工程师更低成本的开发互动游戏,并已经在淘宝、天猫、支付宝、优酷、考拉、菜鸟、盒马等业务场景中使用。
新工具开源!一款双11养猫5亿用户的互动引擎(附地址)
|
机器学习/深度学习 编解码 缓存
成本更低、更优观看体验——自研S265编解码器解析
带宽是直播运营中最大的成本,根据前瞻网估算全行业2020年的CDN费用支出将超过300亿元,在2025年接近1000亿规模(https://bg.qianzhan.com/trends/detail/506/200715-ec767b9b.html),可以说降低带宽是成本控制中至关重要的一环。
成本更低、更优观看体验——自研S265编解码器解析
|
新零售 缓存 编解码
从 350ms 到 80ms,打造新零售场景下 iOS 短视频的极致丝滑体验
内容作为 App 产品新的促活点,受到了越来越多的重视与投入,短视频则是增加用户粘性、增加用户停留时长的一把利器。短视频的内容与体验直接关系到用户是否愿意长时停留,盒马也提出全链路内容视频化的规划,以实现商品力表达的提升。目前已有短视频场景包括:首页、搜索、商品详情、达人秀、沉浸式视频、真香视频、盒区首页 feeds 流、话题、UGC 内容、话题合集落地页、社群、菜谱、盒拍一键剪、直播回放、weex 等。
从 350ms 到 80ms,打造新零售场景下 iOS 短视频的极致丝滑体验
|
监控 黑灰产治理
直播平台开发干货分享——标准直播及快、慢直播的特性
 所谓自己做直播平台开发,要结合不同的应用场景,相对应的功能、硬件、软件配套技术也不同。根据应用场景的不同,自建直播平台可以分为标准直播、快直播和慢直播。本文将简单地为大家分析一下这三点的特性。
直播平台开发干货分享——标准直播及快、慢直播的特性