OPENSTF 平台网络流量优化方案详解

背景

openstf是一款优秀的手机集群管理平台,功能强大、性能优秀、扩展性很高,可以大幅度提高手机的使用效率,使用nodejs和angularjs开发,遵循apache licene2.0开源协议,用户可以对源码进行修改发布。(源码地址:https://github.com/openstf)

使用openstf平台可以方便的对手机进行远程管理、调试、远程手机桌面监控等操作,但是这一切都建立在平台的网络带宽环境非常好的情况下,stf对网络带宽环境要求非常高。为什么存在这种情况,看下图:

在本地搭建一台stf平台服务器,用户从另一台PC访问stf平台对手机进行管理。stf 服务器端通过流量监控软件发现单个访问的上行流量达到3.22MB/s,最高可以到达5MB/s以上。实际上的带宽占用达到5*8=40Mbps,通常情况下平台上不可能只有一个用户,按照10个用户同时使用stf服务的情况下带宽要求达到400Mbps(stf服务的带宽和普通web服务不一样,stf服务的带宽是持续占用的,后续说明)。对于局域网用户来说这个带宽要求勉强达到,但是对于把stf服务发布到公网提供给外部用户使用这种情况带宽成本就太高了,现在电信机房的20M上行带宽成本为每年10万左右。在局域网中同时支撑20个以上的用户同时访问时局域网带宽要求也非常高,不可能为了搭建一个服务改造局域网。为了兼顾用户体验和带宽成本只能从优化stf的数据传输量上找方法了。

问题分析

已经知道 stf服务对带宽占用很高,现在需要找到为什么会占用如此高的带宽,在分析带宽的时候肯定要用到抓包工具。使用chrome自带的devtool工具对stf服务进行抓包,发现stf 的web端会不停的从浏览器缓存中读取图片格式的文件。

对这些图片格式的文件分析后发现这些图片就是被管理的手机的屏幕截图


再查看抓包结果发现有个websocket的长连接一直在从后端推送二进制文件文件到web端,初步推断刚才图片格式文件就是这个websocket连接推送到前端的,前端收到二进制数据后转换成图片格式文件,再把图片展示到web界面上。


为了证明以上推断,关闭手机端的屏幕,这时候发现websocket 完全停止传输数据了,监控流量发现流量基本上为0KB/s。


现在可以断定就是这个websocket服务为了把手机端的屏幕截图实时传输给web端从而占用了大量的网络带宽。这也说明了为什么在stf平台操作手机时网络带宽是持续占用而不是像普通web服务那样有请求才占用带宽。

       要减少websocket 的流量需要从源头优化,减少所传输文件的数据量,这里是一方面需要减小原始手机屏幕截图的文件大小,另一方面减少文件传输的个数。如何减少文件大小,有两个思路:降低图片质量或者降低图片分辨率。如何减少文件个数:这里只能降低图片传输的帧数。解决思路已经确定了,接下来就要分析代码、分析数据流从而优化代码流程达到效果。

工作原理

前面分析到web端的手机屏幕同步来自于对手机屏幕端的同步截图,那么stf截图并发送给web端就可能存在三种方案:

1.    手机端截图后传给stf服务端,stf服务端再传给stf web端

2.    stf平台直接截图后传给stf web端

3.    手机端截图后直接传给stf web端

通过抓包发现与stf web端通讯的websoket的服务地址是 stf服务器的而不是手机的,同时考虑到手机直接传数据给stf web端对手机网络环境的限制(手机和stf 用户需要在同一网络这会严重限制平台使用环境)的要求,这就排除了第三种可能性。接下来就是查资料读代码了,通过官网资料得知,stf使用了minicap这个截图工具。minicap 是一款开源的anroid截屏工具,minicap使用c++开发工作在android ndk层,通过实时抓取手机的显示缓存的数据生成二进制的图片文件信息,因此截图效率极高(android手机屏幕刷新频率有多快minicap截图频率就有多快),这保证了stf在同步android手机的屏幕时高质量、高帧数,同时也导致了很高的带宽占用。这样就确定了stf同步手机屏幕用的是方案一。

针对方案1的优化方案有两种:

A.      修改minicap源码,在android端生成图片数据时就降低图片的大小

B.      在minicap把截图传给stf服务端后,在stf服务端降低图片大小后再传给web端

在对minicap的源码进行研究后就放弃了方案A,minicap源码工程大,逻辑太复杂,同时修改后还要考虑到不同手机的兼容性问题,总之就是工作量大、太复杂。相对的方案B可行性就高很多,只需对stf服务端代码进行修改而不用考虑各种手机的兼容性,而且stf服务端使用的nodejs脚本开发难度小很多。

确定了在stf服务端对图片大小进行降低后再传给web端这种方式接下来需要找到stf端接收minicap数据的逻辑了。在对stf工作流程和代码进行研究后,在plugins/streen/stream.j下找到了stf接收minicap数据的逻辑。

具体逻辑如下:


在手机连接到stf平台后,stf 会加载stream.js,stream.js会建立一个websocket的服务(这个服务是提供给web端的),在建立websocket服务的时候会启动一个websocket的监听者,同时启动一个minicap的实例,stf web端连接websocket服务后会启动一个websocket会话,websocket监听者监听到有屏幕同步信息时就会给minicap的实例发消息,minicap接收消息后开始截屏,在minicap实例截屏后直接通过websocket会话发送给你stf web端,这样stf web端就可以获取到手机的截图了。工作流程图如下:


       由上面的流程图可以看出FrameProducer类是对minicap的原始数据进行处理的,stream.js上有这段代码


通过查阅官方代码发现这里的-Q参数可以调整minicap抓取的图片质量


再看下这个- Q参数的默认值,在stream.js 的启动函数找到了,如果没有人为设置这里的默认值是80,也就是说原始图片质量的80%

.option('screen-jpeg-quality', {

describe: 'The JPG quality touse for the screen.'

, type: 'number'

, default: process.env.SCREEN_JPEG_QUALITY || 80

})

在使用stf管理手机的时候我们主要是操作手机,对手机的显示效果并不关注,因此完全可以把显示质量降低到可用范围从而减少流量,直接把图片质量降低到50%

通过实际使用发现stf web 端50%的显示质量完全可以接受,参考下对比图:左边图片质量为80%,右边图片质量为50%

再看下这时候的实际网络带宽占用对比:左边图片质量为80%,右边图片质量为50%

流量从3.22MB/s降低到了692KB/s,效果很明显了,但是692KB/s相对来说还是不够理想。如果再降低图片质量就不太合适,只能通过降低图片数量来继续降低总的流量了。继续研究stream.js 最终找到了减少传输帧数的方法:在websocket的ws会话发送图片二进制数据到web端时丢弃1/3的数据,修改方式如下

降低帧数前后的对比效果

降低帧数后的前后流量对比

通过降低帧数数据流量从692KB/s降低到了468KB/s,实际使用中降低帧数后的体验并没有相差很远,因为工作在PC 端的浏览器上17帧的刷新屏幕也是够流畅了。

总结

下图是整个优化过程中带宽占用的变化:未优化、只优化图片质量、优化图片质量和帧数

       带宽占用最终降低了10倍左右,整个优化过程中代码修改很少,修改的地方也非常简单。但是如果不对整个stf工具的前后端流程和代码进行研究,不了解底层相关的工作原理还是很难下手的。通过对前端的抓包后端的数据流分析,最终在修改了很少源码情况下起到了立竿见影的效果,节省了10倍的带宽。

展望

从3MB/s到400KB/s的带宽占用这个效果是挺明显的,但是实际上400KB/s的带宽占用还是不够优秀。上面的优化方案已经把stf平台前端显示质量和刷新频率降低到了刚好可用的状态,现在如果还要继续降低带宽占用肯定不能继续用这种方法了,有没有其他方案?在继续研究流量优化方案时,数据流媒体方案展示出来。能否做到在保证用户体验的情况下把3.2MB/s的带宽占用降低30倍达到100KB/s左右?答案是肯定的。下一篇文章“基于流媒体技术的stf平台流量优化方案”。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容