性能与实施 #
了解UPRTC服务、CPU、带宽、人数之间的关系,在实施阶段可以更好选择服务器和网络的配置。
基本概念 #
- 路:一条接收的媒体流在这里被叫一路,例如:用户接收了麦克风和摄像头媒体流,那么就是两路媒体流。
- 带宽:千兆网卡1000Mbit/s换算成实际网速就是125MB/s,云服务器使用带宽单位都是MB/s,直接在网络运营商购买/办理的带宽单位一般是Mbit/s注意要换算成MB/s,1Mbit/s = 0.125MB/s。
- 最大比特率:在创建房间时可以设置用户发送的媒体流最大比特率maxBitrate,这个设置只针对视频流,音频流不做控制, 假如maxBitrate设置为3000000,约等于300kb/s,算上音频和控制协议消耗,实际为310kb/s左右。
- 人数:下述公式中的人数,直播人数可以在不同房间,例如支持直播100人观看,那么这100人可以分布在不通直播间。视频会议人数指的是单场会议支持的最大人数。
服务器 #
一颗CPU核心大概能承载400~600路媒体流的转发,设服务器核心数为C,单CPU核心转发媒体流最大路数为MC,那么一台服务器能支持媒体流转发路数=C*MC
- 直播:每个人需要接收音频和视频两路媒体流,所以服务器能承载的最大人数=C*MC/2
- 视频会议:假设单场会议每个人都开麦克风和摄像头,那么每个人都需要接收其他的人两路媒体流,设服务器能承载的人数为X,
(X-1)*2*X = C*MC,根据求根公式,X = (1 + sqrt(1 + 2*C*CM))/2
以上算法同样支持集群,设集群服务器数量为N,那么直播最大人数=N*C*MC/2,即在公式中C*MC前乘N即可,视频会议同理。
网络 #
带宽 #
在局域网内部署使用,带宽一般是依赖于路由器、交换机,网卡,政企采购一般都是千兆,万兆级别的设备。在互联网部署使用时,带宽在云服务厂商购买,或者直接租用网络运营商机房机位并购买带宽,无论那种方式带宽都是已知的。网络传输中上行和下行是分开的即全双工传输,无论直播还是视频会议对于上行速率需求都远低于下行,所以只需计算下行速率即可。这里我们设服务器最大带宽为B单位为MB/s,设用户发送最大比特流为R单位KB/s
- 直播:1台服务器承载最大人数=B*1024/R,当带宽为B=100MB/s,主播发送比特流为R=320KB/s,最佳观众人数<=320人
- 视频会议:假设单场会议的每个人都开麦克风和摄像头,那么每个人要接收其他人的媒体流,设1台服务器承载最大人数为X,
(X - 1)*R*X = B*1024,简化为X*X -X - B*1024/R = 0,根据求根公式得,X=(1+ sqrt(1 + 4096*B/R))/2,当带宽为B=100MB/s,每个人发送比特流为R=320KB/s,最佳入会人数约为18人
延迟 #
导致视频延迟的因素有,网络延迟/抖动,视频编解码消耗时间、流媒体服务对媒体流的处理时间
视频采集性能取决设备本身。
视频编解码与PC,手机性能相关,主要取决CPU性能,苹果要优于安卓。
UPRTC服务使用C++实现对媒体流的转发,只做转发操作,没有转码不依赖任何外部组件,转发性能取决于CPU的性能,对视频延迟影响是极低的,相对网络对视频的延迟可以忽略不计。
UPRTC客户端SDK视频渲染使用opengl调用GPU渲染,不消耗CPU性能,延迟可忽略不计。
实施 #
首先要明确使用场景,直播还是视频会议,是公网还是内网,如果同时具有直播和视频会议功能,建议分开部署,也就是直播服务和视频会议服务分为两个集群。 其次要确定最大使用人数,如果使用人数很多并且实时人数波动很大建议使用可弹性扩展的实施方案,例如通过k8s监控负载情况,自动扩展或缩减UPRTC服务实例。
列举出上面公式中的变量:
X:最大使用人数
C:CPU核心数
MC:每个核心最大承载路数
N:服务器数量
B:单台服务器带宽,单位MB/s
R:用户能发送的最大比特率,单位KB/s
这里以对1000人公司做内网私有化部署为例,根据上面公式预估出需要什么配置服务器,对网络有什么要求:
直播场景,例如公司内部培训、领导演讲、政策宣讲,培训视频循环回放直播等,人数X=1000,单核最大承载路数MC=400,服务器千兆网卡B=125,用户最大比特率R=320, 需要网速=1000*320/1024=312MB/s,CPU核心数=1000*2/400=5,根据需要网速312除以单台服务器网速125=2.5台服务器,也就是2.5台服务器共有5个CPU核心即可,那么实际需要3台服务器,每台服务器2个CPU核心,每台服务器使用千兆网卡同时接入的路由/交换机/网线也要支持是千兆网络。(服务器之外硬件条件下面不再赘述)
视频会议场景,千人公司按照单场会议100人同时视频会议来算并都打开麦克风和摄像头,人数X=100,单核最大承载路数MC=400,服务器千兆网卡B=125,用户最大比特率R=320,需要网速B=(pow(2*100 -1) - 1)*320/4096≈3093MB/s,CPU核心数=(pow(2*100 - 1) - 1)/2*400≈50,根据需要网速3093除以单台服务器网速125≈25,也就是25台服务器共有50个CPU核心,即需要25台服务器,每台服务器2核心。
单场会议所有人全开麦克风和摄像头的使用场景比较极端,那么我们来看一下所有人只开麦克风把千兆网卡吃满需要什么样的服务器配置?音频流加控制协议最大发送比特流为R=10KB/s,B=125,MC=500,人数X=(1+ sqrt(1 + 4096*125/10))/2≈114,114 = (1 + sqrt(1 + 2*C*500))/2,C=51,结论:51颗CPU核心,千兆网卡服务器能支撑114人同时语音通话。
以上可通过降低最大比特率,增大MC值(CPU性能),来增加最大用户数,减少服务器数量。
在生产环境中上面计算结果中每台服务器核心数可以选择性加1,UPRTC是多进程架构,其中需要一个进程作为调度进程使用,建议单独为调度进程增加一颗CPU核心。
视频会议 #
从公式上可以看出直播和视频会议的区别很大,直播每增加一个观众增加两路媒体流(音频和视频),而视频会议每增加1个人,就等于增加2*X*2路媒体流(X为增加前人数,所有人都有音视频)。上面讨论的是单场视频会议最大人数,但实际使用时不存在单场会议100人同时开麦克风开摄像头的场景,但100人同时开会分布在不同会场的场景是普遍存在的,每个会场情况又有许多不同,有的人只开麦克风,有的麦克风和摄像头都打开的,有的都不开,这些因素都会影响到服务器的承载能力,在生产交付阶段我们会为客户制定最佳的实施方案。