虎牙数万主播同时在线直播的秘密,CDN推流日志上行实时监控
6 月 10 日,又拍云 Open Talk | 2018 音视频技术沙龙·深圳站 顺利落幕,来自虎牙的直播运维研发架构师张波在沙龙上做了《基于CDN推流日志的主播上行实时监控及其自动化解密》的分享。虎牙直播是中国领先的互动直播平台,作为“游戏直播第一股”,是音视频技术的典型应用企业。
张波目前主要负责虎牙直播运维体系的建设,针对 Web 和后台类程序的发布、监控、运维自动化相关的运维系统进行设计和开发。本次分享中,张波结合在一线工作中的实践,介绍虎牙直播针对主播推流在 CDN 环境下的优化技巧,以及实践过程中碰到的各种坑。
以下是分享内容:
虎牙直播作为游戏直播平台,拥有数百个产品线,同时在线主播数高达数万,因此虎牙接入了多家 CDN 厂商。
体量这么大的主播上行量通过 CDN 端推流日志如何做到自动监控,异常及时发现,业务如何通过系统准确定位?
用户侧、网络侧、CDN 运营商侧等引起的故障,如何做到故障分钟定位?
先与用户发现定位系统问题瓶颈,如何用数据指引 CDN 提升服务质量呢?
这次分享,我们就来聊聊如何解决这些问题。
首先是主播监控手段,最直接、最低延时的监控手段是观察用户弹幕喊卡。
当弹幕开始喊卡时,开发会上系统查看端上上报的监控数据来定位问题。但是仅仅依靠服务端数据,是很难确定问题是发生在哪里的,线路、客户端、CDN、IDC 都有可能出现问题。
直播出现问题的原因有很多,我们要如何准确定位业务问题呢?
一般情况下,当虎牙主播直播出现问题后,开发会让运维提供 CDN 服务器端数据,来定位问题,再由运维联系 CDN 运营商排查问题,最后由 CDN 厂商解决问题。
除此之外,虎牙还有其他的监控方案:
- 第三方拨测监控;
- 端上报数据监控(主播端上报,用户端上报);
- 弹幕喊卡监控
- 服务端数据监控;
- 机房网络监控。
CDN 侧健康管理
面向用户体验端到端的健康管理,范围比较大。本次分享主要讲一下 CDN 侧的健康管理,比如判断 CDN 是否存在问题?
上图系统的核心功能主要有:
- 建立应用服务监控视图;
- 关注应用性能;
- 多段、多层数据关联分析;
- 了解用户感知;
- 了解应用最终交付状态;
- 了解应用对业务的影响;
- 端到端覆盖应用路径;
- 追踪应用服务质量;
- 快速诊断和定位故障。
△ 虎牙部分监测系统2
图中也显示了各个线路的质量情况,虎牙每 20 秒检测一个节点情况,而 CDN 的线路图,监控时效性是一分钟延迟,因此全网 CDN 上行质量出现问题的话,会在一分钟内发出告警。同时全网的出现卡顿的主播在卡顿监控中可以试试看到,并实现定位上行卡顿原因,迅速排出是否是厂商线路问题或运营商线路问题。
CDN 端到端的应用性能管理
上图是监测系统的核心功能——端到端的应用性能管理,图中描述了主播上行链路,上行方式分为 CDN 上行和虎牙上行,CDN 上行是指通过 CDN 上行服务进行上行传输。
当 CDN 端接收到上行视频后,会进行转码和转推,转推就是指将虎牙主播的上行流视频转推给其他厂商,让用户在各个厂商和线路上观看到直播。
所以直播上行可能会出现的故障,要么是主播端设备问题,要么是主播端到上行节点网络问题,或者是 CDN 上行服务器节点自身问题,再或者是上行视频转推给其他 CDN 厂商转推问题。
性能数据要覆盖哪些项目
上面这个表格是虎牙实时监控平台的部分核心功能以及性能指标的覆盖项。
主播端主要根据这些参数进行监控,比如 Block 阻塞次数、CPU、解码 CPU、模板 CPU、内存以及断开原因等监控指标。
IDC 层与 CDN 层监控指标相对较少,只有卡顿率和性能指数,这次分享也主要讲解性能指数。
在用户端虎牙设置了感官卡比监控指标,感官卡比就是用户真实感受卡顿的比例,除了感官卡比之外,还有解码方式、主动丢帧等监控项。
实时监控需要注意的技术点
在实时监控这方面,我们使用的相关技术点,主要有:
- 流计算:sprak
- 实时日志存储:内部日志索引服务
- 数据存储:Hbase、Opentsdb
主播上行部分数据处理量并不大,即使是虎牙这个体量的直播平台,原始日志一秒一条日志5秒合并输出一条。
aac: bigint 接收或者发送aac的次数
abytes:#### string 接收或者发送的音频字节数
adrop:#### string 音频发送丢帧数
afcnt:#### string 音频帧数
afts:#### string 音频时间戳
agap:#### string 音频帧最大接收间隔(ms)
app:hunantv string rtmp协议中的app
appbuf:#### string 应用层发送队列长苏
avc: bigint 接收或者发送的avc的次数
block: bigint 卡顿次数
bwin:0.0000 double 入带宽
bwout:76382.0000 double 出带宽
gop: bigint 关键帧序号
mss:#### string mss大小
netqlen:#### string tcp发送大小
retrans:#### string 重传包数
rtt:#### string tcp层的rtt (ms)
rwd: string tcp的接收窗口大小.目前为空
sndbuf: string tcp的发送大小
tcpbuf:#### string tcp的buffer大小 字节数
vbytes:#### string 接收发送的音频字节数
vdrop:#### string 视频丢帧数
vfcnt:#### string 视频帧率
vfts:#### string 视频时间戳
vgap:#### 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":,"ats":,"inarea":"河北","inip":"124.239.xxx.xx","inisp":"电信","its":,"streamhost":"ws.xxx.huya.com","streamname":"/huya/xxx-xx-xx-xxx-xx-A-xxx-1","uip":"123.182.xx.xxx","vfps":,"vts":}]
its 采集时间戳(毫秒) uip 主播IP,
△ 虎牙统一上行标准日志
上面表格是日志监控解决方案,虎牙定义了用于监控的标准日志。统一标准后的日志对比之前的日志减少很多内容。
重点提取了采集时间戳、主播 IP、节点 IP、节点省份、推流域名、视频帧率、视频时间戳、音频时间戳、音频帧率等监控项数据,有利于对数据进行分析。
如何设计统一上行质量度量方式
在度量上行质量方面,虎牙使用的是一个国际通用标准,Apdex 是用户对应用性能满意度的量化值。它提供了一个统一的测量和报告用户体验的方法,把最终用户的体验和应用性能作为一个完整的指标进行统一度量。
Apdex 会定义应用响应时间的最优门槛为 T,另外根据应用响应时间结合 T 定义了三种不同的性能表现:
- Satisfied(优质):应用响应时间低于或等于 T(T 由性能评估人员根据预期性能要求确定),比如 T 为 1.5s,则一个耗时 1s 的响应结果则可以认为是 satisfied 的;
- Tolerating(可容忍):应用响应时间大于 T,但同时小于或等于 4T。假设应用设定的 T 值为 1s,则 4 * 1 = 4 秒极为应用响应时间的容忍上限;
- 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. 主播上行,运营分析:利用全方位的主播上行性能数据,出具主播质量和线路质量性能报告,从业务角度为主播上行质量运营提供分析数据。
查看讲师分享 PPT 和分享视频,请进入下方传送门:
虎牙数万主播同时在线直播的秘密,CDN推流日志上行实时监控的更多相关文章
- 鹅厂优文|主播pk,如何实现无缝切换?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文作者,rexchang(常青),腾讯视频云终端技术总监,2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手 ...
- EasyDSS直播服务器如何帮助用户解决OBS不能同时同步输出多路直播流到直播平台、CDN平台的限制
最近有用户突然寻求帮助,大概的意思就是说: 他需要同步将桌面的直播同时RTMP发布到:斗鱼.熊猫TV等等多个平台,但是OBS又只能同时采集并发布推流直播到单一个平台,而且有时候在4G或者网络比较差的情 ...
- 记录一下自己爬虎牙LOL主播的爬虫思路
1.明确爬虫目的 爬虫目的需要我们明确的,没有目的的爬虫都是耍流氓!像我这次爬虫目的能不能从网页上爬下来. 2.怎么来爬? a. 先要找到具有唯一性的标签 <li class="gam ...
- 使用Python自带的库和正则表达式爬取熊猫直播主播观看人气
主要是体现代码的规范性 from urllib import request import re class Spider(): url = 'https://www.panda.tv/cate/lo ...
- python爬虫--看看虎牙女主播中谁颜值最高
目录 爬虫 百度人脸识别接口 效果演示 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知 ...
- 自从用python写了个自动弹幕脚本后,各大主播都来找我,净赚十万!
大家好,今天又给大家带来了Python爬虫的分享,今天我们继续上次的问题,继续来研究一下虎牙平台的爬虫. 起因 写完上次的代码,我冒出有一个很有趣的想法,就是,我们可以使用selenium来完成虎牙自 ...
- 90后外挂开发者:已经有许多主播在我这里在外挂,我月入50W
绝地求生上线不到一年已经火爆全球,玩家们表示再差的优化也抵挡不住我们玩游戏的热情,近日,各大平台主播糯米油条五五开等人的开挂实锤闹得沸沸扬扬,玩家之间刮起了一阵反击外挂的风暴. 俗话说得好,没有买卖就 ...
- 免费丨十大IT热门学科在线直播体验课正式来袭,全免费!!!
一场突如其来的疫情阻挡了人与人之间的接触,在这一系列困难面前,无数勇敢的人们挺身而出,千里驰援,默默承担,用行动践行责任与信念,希望与祖国和家人一道共渡难关. 传智播客作为一家致力于“高精尖”IT科技 ...
- 关于开启.NET在线提升教育培训的通知! - 可在此页面观看在线直播!
年前在线公开课程通知: 近期在开启VIP课程,隔天讲一次,年前其它时间插空讲公开课,主题:设计模式系列 1:培训 - 大概不会讲的内容: 1:不讲系列. 2:不讲入门. 3:不讲我不懂的! 2:培训 ...
随机推荐
- docker修改容器参数
docker update -m 500m --memory-swap - f669487f0804
- kafka+zookeeper集群
参考: kafka中文文档 快速搭建kafka+zookeeper高可用集群 kafka+zookeeper集群搭建 kafka+zookeeper集群部署 kafka集群部署 kafk ...
- ELK logstash geoip值为空故障排查
首先我们用的是elasticsearch+kibana+logstash+filebeat 客户端filebeat收集日志后经过服务端logstash规则处理后储存到elasticsearch中,在k ...
- Ubuntu14.04下如何配置固定IP
首先用root用户登陆,然后输入你root的密码.如下图: 然后编辑interfaces文件,该文件位于/etc/network/下,执行如下命令: vim /etc/network/interf ...
- mysql的复习
. 着重号,区分字段和关键字的符号 +号是运算的 起别名,其中的as可以省略 ifnull(expr1,expr2),expr1代表输入的字段,expr2代表如果输入的字段是null则为expr2 条 ...
- Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to ;XX.XX.XX.XX:6379] with root cause
java.net.ConnectException: Connection refused: no further information at sun.nio.ch.SocketChannelImp ...
- Maven 插件之 docker-maven-plugin 的使用
目录 docker-maven-plugin 介绍环境.软件准备Demo 示例 配置 DOCKER_HOST示例构建镜像 指定构建信息到 POM 中构建使用 Dockerfile 构建使用命令绑定 D ...
- Spring源码Gradle
Microsoft Windows [版本 10.0.17134.590](c) 2018 Microsoft Corporation.保留所有权利. D:\Workspaces\idea\sprin ...
- 2分钟读懂大数据框架Hadoop和Spark的异同
转自:https://www.cnblogs.com/reed/p/7730313.html 谈到大数据,相信大家对Hadoop和Apache Spark这两个名字并不陌生.但我们往往对它们的理解只是 ...
- vue事件修饰符
阻止单击事件冒泡 <a v-on:click.stop="doThis"></a>提交事件不再重载页面<form v-on:submit.preven ...