[.com原稿]一、背景介绍---点播视频源站分发痛点点播视频观看流程及源站定义点播是相对于直播而言,英文名称是VOD(VideoonDemand)。顾名思义,只有当某个观众有需求时,视频才能被观看,看到的内容是视频的开头;直播的时候,不管有没有人在看,视频都是一直往前走的。走吧,一个观众进来看到的就是当时的视频。点播视频的内容非常多样,有连续剧、电影、体育视频、自媒体制作的视频,甚至还有(现在很流行的)短视频。你有没有想过每次打开点播视频背后的操作是怎样的?一个简单的观点,如图:视频网站提供点播资源,比如PPTV有新剧,有电影,或者短视频网站提供新的短视频,观众通过网页访问,apps等等网站,看视频其实情况并没有这么简单。视频网站提供的点播资源,也就是文件,都放在自己公司的服务器上。这个服务器可能是买来的,也可能是租来的,用来存放这些文件的服务器集群,我们称之为源站。这些视频文件不是用户直接访问的,而是通过CDN逐步分发的。所以这些存储集群还要负责对接CDN,所以源站的作用就是负责存储。而与CDN对接,这里有分工,视频网站拥有视频版权,CDN擅长分发。我们来看看点播的处理流程,包括短视频视频网站。过程如下:内容生成(这是视频网站之外可以做的)。视频网站购买版权,或者自媒体作者制作好的视频,短视频作者用手机录制视频,上传内容到视频网站的片源存储。视频网站编辑上传购买的版权视频,自媒体和短视频作者上传自己制作的视频,选择是否打压(根据特点)。视频网站根据视频的特点选择是否压缩视频。比如短视频可以不用压缩在手机上播放,而电影系列一般都是压缩多个码率分段存储。压缩(或未压缩)的视频称为电影,它被存储并返回到源。CDN将这些视频从全量存储下载回源,向观众展示源站和CDN的网络拓扑。我们知道以下事实:一个视频网站的(完整)视频一般不会只放在一个机房里。比如PPTV视频和体育会放在上海的机房,因为体育演播室在上海,本地录制方便,不需要网络带宽;影视会放在武汉的机房,因为剪辑中心在武汉。一个视频网站会接入多个CDN,或者自己搭建一个CDN。比如PPTV,在自有CDN的基础上,与国内外各大知名CDN厂商深度合作。每个CDN(包括自建)供应商的网络接入点和质量都不同。对于一个网站来说,一个视频文件只保存一两份(当然,视频公司会做冷热备份等操作,所以其实磁盘上的存储不仅这么小,这个细节属于属于存储高可用的范畴,我就不多说了),为了将唯一数据存储在不同机房,同时将唯一数据发送到多个CDN,源站需要使用多级缓存结构。视频源站点内部多级缓存之间的分布,即多个机房之间的分布,称为内部分布;视频源站点(L2集群)与CDN接入点之间的分发称为外分发。L2集群一般连接CDN接入点。与CDN连接时,即使在运营商的机房,也会选择优质线路。因此,我们介绍的重点仍然是如何将视频文件从N个分片存储集群通过KL1集群分发到ML2集群。点播视频源站在分发过程中,存在问题。点播视频从中心集群分发到L1、L2集群(机房)时,采用树状分布(这种树的建立会根据经验或网络本身的特点),每个中心node到不同L1机房的线路质量差别很大,不同L1机房到L2机房的线路质量也差别很大。分发过程使用网线(专线太贵),网线稳定性不可预测。由于光缆被切断而导致配线故障,甚至导致某个骨干网不可用的情况时有发生。某条线路或某机房出现问题,可能会导致区域不可用。不同集群(机房)规划建设时,服务器(Computing、Storage、IO)能力和出入口带宽不同,向下分布时不同集群对应的节点数量也不一致。不同集群之间的负载会有较大差异,俗称忙闲。一个繁忙的节点很可能成为一个瓶颈环节,而不是按照那个配置死掉的回源树,分发过程会带来这些优势:更高效稳定避免区域性故障不同集群(机房)的负载比较合理和平均2.节点间数据分布质量评价为什么要先评价两个服务器节点之间的分布质量?前面说了,优化的方法就是选择好的分发链路。那么,如何分配一个链接才是好链接呢?我们先来看以下几个事实:链路是由数据通过的服务器节点组成的链路。相邻服务器节点传输质量的最差值决定了这条分发链路的质量上限。因此,我们首先研究两个服务器节点之间的传输质量评估两个服务器节点之间的传输质量然后,用什么来评估两个服务器节点之间的传输质量,我们自然希望有一个量化的数据,一个简单的想法就是“文件下载”耗时”。影响两个服务器节点之间传输质量(下载时间)的因素有:文件大小、服务器之间的网络线路情况,包括数据延迟、丢包率、跳数等。发送服务器(接收服务器)的当前负载,包括CPU负载、内存使用、IO负载、当前带宽、存储使用和当前时间。我们将简要分析这些因素将如何影响下载。文件大小:文件越大,下载越慢,需要的时间越长两台服务器之间的网络线路情况:两台服务器之间的网络情况,具体这些指标延迟:下图中的ping命令可以测试两个服务器之间的延迟信息。对于数据传输来说,延迟越小越好MTU(MaximumTransmissionUnit):是指可以通过某种通信协议的某一层的最大数据包大小(以字节为单位)。***传输单元该参数通常与通讯接口(网卡、串口等)有关。如果是1492,就需要打包成3个包,当然3个包比2个包要花更多的时间。丢包率:下图中的ping命令显示当前丢包为0,当网络出现问题时,这个数据可能不为0。视频下载是基于HTTP的,底层是TCP协议。数据包丢失后,必须重传。丢包率越低,跳数越好:跳数代表两台服务器通信经过的路由设备的数量。当数据经过路由器时,路由器中会有一个数据包队列。如果队列太满,数据可能会被丢弃;路由器在计算数据包的下一跳时,也需要一定的时间;服务器的最大带宽:服务器的最大带宽,当然越大越好(当然成本也越高),比如家里装宽带,500M肯定比100M好(也贵)。发送服务器(接收服务器)当前负载CPU负载:当CPU负载不大时,对下载影响不大。当CPU负载超过一定值时,会严重影响下载效率内存占用:当内存占用不高时,对下载影响不大。当内存占用超过一定值时,会严重影响下载效率。IO负载:当IO负载不大时,对下载影响不大,当IO负载超过一定值时,会严重影响下载的效率。当前带宽使用情况:当当前带宽未接近最大带宽时,对下载影响不大。阻塞会严重影响下载效率。图中是top命令看到的当前机器负载的当前时间:上面说的数据是随时间波动的。比如带宽数据,视频网站早上看的人少,晚上看的人多,工作日和周末看的人数不一样。在一些假期,有新的特点。整体互联网使用趋势是向上的,所以从长期来看,带宽数据应该是向上波动的。的。这是一个问题。正是因为相同大小、相同链接的下载速度在不同时间点的性能差异巨大,所以有必要引入动态预估机制。例如,文件大小为2G。在开始下载之前,我们认为链接A是最好的,但实际上下载300M之后,链接A的质量已经不行了。这是因为链路B可能更糟。那么,我们要实现的就是计算下载一个2G文件的综合耗时最大值是多少。建立两个节点之间的数据传输质量模型的思想是衡量两个节点之间的分发质量。我们可以用一个值,下载时间(简称DT)来表示这个数据。规则因素(变量),那么我们可以有一个好主意:用一个模型,或者说函数,来描述这些因素和DT之间的关系,下载新文件的时候用这个模型,输入当前的这些变量预测多长时间文件下载需要。假设函数如下:DT=Func(file_size,current_time,defer,cpu_load,mem_load,io_load,...)我们知道一个文件大小为100M,当前时间点已知,节点间的这些变量也已知.我们可以使用这个函数算出时间。3.机器学习算法的设计与实现机器学习的引入已经被提出来建立一个模型(函数)来预测DT。如何建立这个模型?让我们先看看它在数学上是如何完成的。在数学领域,对于一组自变量和因变量数据,逆向求函数的过程称为拟合二维空间。一自变量一因变量,就是简单的曲线拟合,三维空间,两个自变量,一个因变量,是曲面拟合,在N维空间,N-1个自变量,一个因变量,也可以拟合,这些具体的算法在数学书上都有,比如最小二乘法,有兴趣的同学可以自行查阅。在计算机科学领域,人工智能研究的先驱提出了用神经网络进行机器学习的方法来处理这个问题。什么是机器学习?现在网上有很多解释。下面简单说明一下已知的输入输出给机器(电脑上的程序),让它找到规律(知识发现),然后让它根据找到规律,用新的输入计算出新的输出,然后评估输出结果,如果合适,正面鼓励,如果结果不合适,告诉机器这是错误的,让它重新找规律。这个过程实际上是在模拟或实现人类的学习行为,以获取新的知识或技能,重组已有的知识结构,不断提高自身的性能。机器学习的本质是让机器根据已有的数据分析出一个模型来表示隐藏在数据背后的规律(函数)。这个找规律的过程如何实现呢?先说数学中如何建立函数(如何做拟合),过程如下:选择一个拟合函数(幂函数、指数函数、对数函数、三角函数等)设置参数比较误差,adjustparameteriterationsforthegraph在这一系列的点中,我们觉得这些点的排列符合正弦函数,那么我们就用三角函数中的正弦函数来拟合,并设置函数周期、幅值的参数,phase等。你和你发现x>5之后,还是有一定的误差,这就需要你去判断这个误差是否可以接受。如果不是,则需要重新安装。对于上图中这些点的拟合,我们发现这些点的分布好像是一条抛物线,那么根据我们的中学数学知识,抛物线就是二次幂函数在幂函数中的映象,所以用二次幂函数拟合,最终得到一个方程为。与数学领域一样,在人工智能领域,输入通过模型(函数)转化为输出。这个模型(函数)是如何确定的?这要靠猜!猜不是问题,问题是如何猜得更准?AI的先驱们提出了模拟人脑神经元的想法来处理如何猜测模型的问题。神经网络和人工神经网络。每个神经元只负责处理一定的输入,做出一定的输出,并传送到下层节点,最后组合起来形成人脑中的神经网络。这就是动物思维的过程。人工神经网络就是人为地构建一些处理节点(模拟大脑神经元),每个节点都有一个功能,处理若干个输入,产生若干个输出,每个节点与其他节点结合形成一个模型(函数)。从左到右分别是输出层、隐藏层和输出层。输入层负责接收输入,输出层负责输出结果,隐藏层负责中间计算过程。隐藏层中的每个节点都是一个处理函数。隐藏层的结构,即层数、节点数,或者每个节点的功能,将决定整个神经网络的处理结果。Tensorflow简介网上有很多关于Tensorflow的介绍(大家可以搜索查看)。根据本文的上下文,我们简单介绍如下:Tensorflow是一个通过神经网络进行深度学习的平台。我们给它输入、输出和约定(猜模型)规则,让他帮我们猜具体的模型。使用TensorFlow的步骤可以简单概括为,收集训练数据,训练,比较,迭代.....收集训练数据下面介绍如何收集训练数据,建立两个节点间的传输质量模型。如前所述,数据分为输入数据和输出数据。输入数据有4种:下载文件大小-可以直接记录当前时间-使用unix时间戳统计网络情况-一些测速工具发送(接收)服务器的负载情况-zabbix记录输出数据是timetodownloadafileRecords需要离散化(后面会介绍离散化的原因)Zabbix介绍:zabbix,一个基于WEB界面的企业级开源解决方案,提供分布式系统监控和网络监控功能,可以监控各种网络参数保证服务器系统。安全操作;并提供灵活的通知机制让系统管理员快速定位/解决各种问题zabbixserver和可选组件zabbixagent支持Linux,Solaris,HP-UX,AIX,FreeBSD,OpenBSD,OSXZabbix传输上部署了angetnode,周期性的收集机器的负载和带宽使用数据,汇总到中心(zabbixserver)。下图是zabbix当前的带宽统计:下图是3个月的带宽负载:下图是3个月的cpu负载:使用IPERF工具收集网络数据。IPERF工具可以采集如下数据:当前服务器间传输带宽丢包率MSS、MTU支持tcp/udp下图是iperf使用截图:Ping工具采集时延,测试节点连通性:Tractroute工具采集节点间跳数信息(在windowscmd中,命令为tracert)训练准备数据合并格式化:将网络数据、负载数据、文件大小、时间、格式合并成一个JSON。将下载的耗时数据离散化成段。这里解释一下为什么要将结果(输出)离散化。TensorFlow擅长学习分类处理。当分类结果集为连续集时,可能的结果有无穷多,会大大增加训练难度,降低训练速度。将结果离散化,将接近时间的时间处理成一个值,将超过一定阈值的时间转化为一个值,这样就限制了结果范围,会大大降低训练难度。训练模型参数的预置:我们在讲数学类拟合的时候,首先会根据我们的经验(xia)test(meng),从幂函数、三角函数、指数函数、对数函数中选择一个或多个。它是多种组合的组合,作为拟合的基础。对于神经网络,我们不能让它随便猜,而是要根据已知(geng)知识(shi)经验(xia)经验(meng)来设置模型和参数。前面说过,每个节点都是一个函数,那么我们应该选择什么函数呢?让我们首先考虑最简单的情况,即线性函数。我们使用一堆线性函数组合成一个网络。这个网络描述的模型肯定还是线性模型,不足以描述世界上大部分的规律。下图是一个常见的线性函数:那么我们考虑将每个函数都非线性化,即在一个线性函数之外,加入一个非线性函数(称为激活函数),然后组合成一个网络,这个网络的描述的模型基本上可以涵盖世界上大部分的规律(别问我为什么,我不懂。。。)。下图是一些常用的非线性函数:形成的网络:每个节点上的函数类型,我们先猜一个,然后网络的结构用了多少层,每层用了多少个节点层?不同领域做神经网络的时候,选择真的不一样。我们在评估节点间的传输质量时,首先根据(脑)检(门)设置层数为15,每层50个节点,节点功能也根据基本经验设置。以下参数会影响TensorFlow的训练结果:初始学习率、学习率、衰减率、隐藏层节点数、迭代次数、正则化系数、滑动平均衰减率、批次数、线性函数、激活功能。其中,隐藏层的节点数,以及迭代次数,批量训练的次数,线性函数,激活函数的设置都会有较大的影响。如何设置上面已经说了,剩下的参数影响稍微小一些。感兴趣的同学可以自行搜索。TensorFlow对单个节点的处理流程如下图所示:一个节点进行ReLU(Wx+b),然后与其他节点结合,最终生成一个输出结果。整体分为以下几个步骤:数据输入训练训练结果查看调整参数Retraining训练结果查看...我们得到了每两个(需要的)服务器节点之间的训练模型,通过这个模型,输入当前文件大小、时间、服务器和网络测试状态,就可以计算出一个预期的下载传输时间。我们将节点间成对计算的结果放入网络拓扑图中,使用最短路径算法计算最优(和次优)传输路径。这里的算法是Dijkstra'salgorithm(译为Dijkstra'salgorithm)这是一个非常经典的最短路径算法,就不占篇幅介绍了。感兴趣的同学可以自行搜索。整体处理流程回顾首先收集训练数据,以zabbix数据、网速数据、文件大小、当前时间信息为输入,下载时间为输出进行模型训练,不断优化模型。使用当前的zabbix数据、网速测量数据、文件大小、当前时间信息作为输入,使用训练好的模型进行计算,得到预期的下载结果。相关节点成对计算预期结果组成传输网络,利用Dijkstra算法计算传输网络中的最小路径。4.未来使用***流式算法进行文件分片下载的展望目前的算法是针对下载整个文件的。其实流媒体服务器已经实现了文件的虚拟切割,http协议也有范围请求。在此基础上,拆分一个文件,同时通过多个链接下载,会提高下载速度,进一步提高网络利用率。具体可参考EK算法、Dinic算法等。采用最小成本***流改进***流算法考虑到每个机房、每条线路在建设时成本不同。当***流量有多套解决方案时,每边附加一个单位费用,在遇到***流量时计算最小费用,这样费用会更细化,机房需要被扩大。它还将被制作成指南。直播领域的应用目前由点播源站内部分发。用于模型训练的输入数据为上述数据,结果下载耗时;对于直播,可以利用直播相关的数据进行组合训练,结果就是QoS。生成新模型预测直播回源内部调度的最优链路。【作者简介】曾小伟,PP云科技副总监,图像编解码、高性能计算背景,辅修AI(NLP方向)。他在流媒体服务器开发和架构设计方面拥有超过12年的经验。【原创稿件,合作网站转载请注明原作者和出处为.com】
