6 月 10 日,又拍云 Open Talk | 2018 音视频技术沙龙·深圳站 顺利落幕,来自虎牙的直播运维研发架构师张波在沙龙上做了《基于CDN推流日志的主播上行实时监控及其自动化解密》的分享。虎牙直播是中国领先的互动直播平台,作为“游戏直播第一股”,是音视频技术的典型应用企业。

张波目前主要负责虎牙直播运维体系的建设,针对 Web 和后台类程序的发布、监控、运维自动化相关的运维系统进行设计和开发。本次分享中,张波结合在一线工作中的实践,介绍虎牙直播针对主播推流在 CDN 环境下的优化技巧,以及实践过程中碰到的各种坑。

以下是分享内容:

虎牙直播作为游戏直播平台,拥有数百个产品线,同时在线主播数高达数万,因此虎牙接入了多家 CDN 厂商。

体量这么大的主播上行量通过 CDN 端推流日志如何做到自动监控,异常及时发现,业务如何通过系统准确定位?

用户侧、网络侧、CDN 运营商侧等引起的故障,如何做到故障分钟定位?

先与用户发现定位系统问题瓶颈,如何用数据指引 CDN 提升服务质量呢?

这次分享,我们就来聊聊如何解决这些问题。

首先是主播监控手段,直接、低延时的监控手段是观察用户弹幕喊卡。

当弹幕开始喊卡时,开发会上系统查看端上上报的监控数据来定位问题。但是仅仅依靠服务端数据,是很难确定问题是发生在哪里的,线路、客户端、CDN、IDC 都有可能出现问题。

直播出现问题的原因有很多,我们要如何准确定位业务问题呢?

一般情况下,当虎牙主播直播出现问题后,开发会让运维提供 CDN 服务器端数据,来定位问题,再由运维联系 CDN 运营商排查问题,然后由 CDN 厂商解决问题。

除此之外,虎牙还有其他的监控方案:

  1. 第三方拨测监控;
  2. 端上报数据监控(主播端上报,用户端上报);
  3. 弹幕喊卡监控
  4. 服务端数据监控;
  5. 机房网络监控。

CDN 侧健康管理

面向用户体验端到端的健康管理,范围比较大。本次分享主要讲一下 CDN 侧的健康管理,比如判断 CDN 是否存在问题?

image.png

上图系统的核心功能主要有:

  1. 建立应用服务监控视图;
  2. 关注应用性能;
  3. 多段、多层数据关联分析;
  4. 了解用户感知;
  5. 了解应用交付状态;
  6. 了解应用对业务的影响;
  7. 端到端覆盖应用路径;
  8. 追踪应用服务质量;
  9. 快速诊断和定位故障。

image.png

image.png

image.png

image.png

△ 虎牙部分监测系统

图中也显示了各个线路的质量情况,虎牙每 20 秒检测一个节点情况,而 CDN 的线路图,监控时效性是一分钟延迟,因此全网 CDN 上行质量出现问题的话,会在一分钟内发出告警。同时全网的出现卡顿的主播在卡顿监控中可以试试看到,并实现定位上行卡顿原因,迅速排出是否是厂商线路问题或运营商线路问题。

CDN 端到端的应用性能管理

image.png

上图是监测系统的核心功能——端到端的应用性能管理,图中描述了主播上行链路,上行方式分为 CDN 上行和虎牙上行,CDN 上行是指通过 CDN 上行服务进行上行传输。

当 CDN 端接收到上行视频后,会进行转码和转推,转推就是指将虎牙主播的上行流视频转推给其他厂商,让用户在各个厂商和线路上观看到直播。

所以直播上行可能会出现的故障,要么是主播端设备问题,要么是主播端到上行节点网络问题,或者是 CDN 上行服务器节点自身问题,再或者是上行视频转推给其他 CDN 厂商转推问题。

性能数据要覆盖哪些项目

image.png

上面这个表格是虎牙实时监控平台的部分核心功能以及性能指标的覆盖项。

主播端主要根据这些参数进行监控,比如 Block 阻塞次数、CPU、解码 CPU、模板 CPU、内存以及断开原因等监控指标。

IDC 层与 CDN 层监控指标相对较少,只有卡顿率和性能指数,这次分享也主要讲解性能指数。

在用户端虎牙设置了感官卡比监控指标,感官卡比就是用户真实感受卡顿的比例,除了感官卡比之外,还有解码方式、主动丢帧等监控项。

实时监控需要注意的技术点

在实时监控这方面,我们使用的相关技术点,主要有:

  1. 流计算:sprak
  2. 实时日志存储:内部日志索引服务
  3. 数据存储:Hbase、Opentsdb

主播上行部分数据处理量并不大,即使是虎牙这个体量的直播平台,原始日志一秒一条日志5秒合并输出一条。

aac:0  bigint 接收或者发送aac的次数
abytes:4017#5733#7186#5642#4179  string  接收或者发送的音频字节数
adrop:0#0#0#0#0  string 音频发送丢帧数
afcnt:30#43#53#42#31 string 音频帧数
afts:468664897#468665895#468667126#468668101#468668821 string 音频时间戳
agap:0#0#0#0#0 string 音频帧接收间隔(ms)
app:hunantv  string  rtmp协议中的app
appbuf:0#0#0#0#0  string 应用层发送队列长苏
avc:0  bigint 接收或者发送的avc的次数
block:0  bigint 卡顿次数
bwin:0.0000  double 入带宽
bwout:76382.0000  double 出带宽
gop:180871  bigint 关键帧序号
mss:1460#1460#1460#1460#1460  string  mss大小
netqlen:96617#70188#57206#74576#106873  string tcp发送大小
retrans:0#0#0#0#0 string 重传包数
rtt:1#1#1#1#1 string  tcp层的rtt (ms)
rwd:0 string tcp的接收窗口大小.目前为空
sndbuf:0 string tcp的发送大小
tcpbuf:715#2841#1808#19705#724 string tcp的buffer大小 字节数
vbytes:64523#51103#64525#103969#68513 string 接收发送的音频字节数
vdrop:0#0#0#0#0  string 视频丢帧数
vfcnt:17#25#31#25#17 string 视频帧率
vfts:468664864#468665864#468667104#468668104#468668784 string 视频时间戳
vgap:0#0#0#0#0 string 视频帧之间间隔 (ms)
vhost:xx.mgtv.com string  域名
vname:xx.mgtv.com_HNGGMPP360 string 流名

上面这个表格是 CDN 上行日志,可以看到其中的描述项非常多,能够直接反应主播上行质量的指标并不多。

我们要如何从日志中挑选出需要的数据进行监控呢?

its 采集时间戳(毫秒)
uip 主播IP,点分十进制
inip 节点IP,点分十进制
inarea 节点省份
inisp 节点ISP信息
streamhost 流域名,如:tx.direct.huya.com
streamname 流名称
vfps 视频帧率 (5秒一条数据,1秒一个值,每个值用#分隔)
vts 视频时间戳(毫秒) (5秒一条数据,1秒一个值,每个值用#分隔)
afps 音频帧率
ats 音频时间戳(毫秒)
[{"afps":30,"ats":9689432,"inarea":"河北","inip":"124.239.xxx.xx","inisp":"电信","its":1521530182,"streamhost":"ws.xxx.huya.com","streamname":"/huya/xxx-xx-xx-xxx-xx-A-xxx-1","uip":"123.182.xx.xxx","vfps":30,"vts":9689399}]

△ 虎牙统一上行标准日志

上面表格是日志监控解决方案,虎牙定义了用于监控的标准日志。统一标准后的日志对比之前的日志减少很多内容。

重点提取了采集时间戳、主播 IP、节点 IP、节点省份、推流域名、视频帧率、视频时间戳、音频时间戳、音频帧率等监控项数据,有利于对数据进行分析。

如何设计统一上行质量度量方式

在度量上行质量方面,虎牙使用的是一个国际通用标准,Apdex 是用户对应用性能满意度的量化值。它提供了一个统一的测量和报告用户体验的方法,把用户的体验和应用性能作为一个完整的指标进行统一度量。

Apdex 会定义应用响应时间的适宜门槛为 T,另外根据应用响应时间结合 T 定义了三种不同的性能表现:

  1. Satisfied(优质):应用响应时间低于或等于 T(T 由性能评估人员根据预期性能要求确定),比如 T 为 1.5s,则一个耗时 1s 的响应结果则可以认为是 satisfied 的;
  2. Tolerating(可容忍):应用响应时间大于 T,但同时小于或等于 4T。假设应用设定的 T 值为 1s,则 4 * 1 = 4 秒极为应用响应时间的容忍上限;
  3. Frustrated(劣质):应用响应时间大于 4T。

这个方案描述了服务质量如何度量,它将服务质量分为三部分:优质样本

可容忍样本、劣质样本。

这样操作就把复杂的操作变简单,三级度量,每一级度量都会有对应的分值,优质样本1分,可容忍样本0.5分,劣质样本0分,复杂问题通过计算公式简单化。

再者,上行质量要怎么去度量呢?

我们可以这样来看,在帧率没有出现明显抖动时,用户感觉不到卡顿,我们就没有必要把这个上行定义为问题。

样本:当前平均帧率与前两秒抖动差值
优质样品: 0% <= 评分 < 5%
可容忍样品: 5% <= 评分 < 10%
劣质样品: 10% <= 评分

虎牙通过测量当前平均帧率与前两秒抖动差值,来度量优质样本。

优质样本要求评分在 0% 到 5%,可容忍样品在 5% 到 10%,劣质样本小于等于10%。

一般来说,如果主播视频的平均上行帧率是 30 帧,5%是指抖动 1 秒产生的抖动帧是 1.5 帧。

1.5 抖动帧,大部分人感觉不到画面抖动,但是达到 3 帧时,用户就能感受到画面的抖动。

通过实时/离线计算结合,提升数据准确性

虎牙的计算方式是实时和离线结合的,实时计算由于数据延迟,或者实时计算问题,导致数据不太精准。

如果要实时计算的数据作为调度或者厂商质量评判标准的话,就需要辅以离线计算,让数据更准确,才能指导厂商优化节点以及调度服务优化线路。

主播上行质量实时监控系统应用的典型场景

主播上行实时监控的应用场景有四个方面:

1. CDN 入围测试:制定入围标准,上行接入质量达到,缩短测试周期

2. CDN 运行监控:实时获取CDN端运行数据,对可能的主播运行风险进行及时预警,实现主播级的故障自愈和问题定位

3. 节点质量管理:实时评价CDN上行节点健康度,主动发现影响客户体验因素,屏蔽质量较差的节点和线路

4.主播上行,运营分析:利用全方位的主播上行性能数据,出具主播质量和线路质量性能报告,从业务角度为主播上行质量运营提供分析数据。