公司新闻

为什么你的缓存会如此不堪!!!

2018-07-29 浏览:2334

        很多做民营宽带的客户经常问一个问题,为什么买了1000M甚至不限速的缓存系统,但实际使用中没有效果,通过路由观察缓存的流量始终100M左右甚至更低。今天这篇文章我们不引用任何测试结果,仅从技术分析的叫角度来解答这个问题。为什么你的缓存会如此不堪!!!

一、什么是缓存系统?缓存系统有几种?它们有什么区别?
        传统意义上将缓存系统存在于计算机和网络的任何一个角落,可以说我们用到的一切软件都有缓存,最常用的缓存其实就是你的网页浏览器,我们都知道同一个网页第二次打开总比第一次的速度快,这是因为浏览器将网页的一些图片、框架、JS、CSS文件缓存到了本地磁盘,如果页面没有任何更新就直接从本地读取。当然这跟我们今天要分析的这种缓存系统同属一类作用但又是完全不一样的东西。

        目前对于网络加速方面的缓存系统从原理上来讲分为两类,文件型缓存和CDN缓存。对于CDN缓存来说往往只有电信联通或者大型网站加速节点才会使用,价格高昂。民营宽带企业最多的也只有文件型缓存。文件型缓存的工作原理很简单,它通过记录用户的请求数据得到一个文件列表,然后将这些文件以一定的规则存储到本地,存储成功后,会监听用户的请求,如果有用户请求相同的文件,则通过302重定向或者DNS牵引等方式将用户的请求定位到本地存储的文件,达到降低出口带宽压力,提升用户体验的目的。

        文件型缓存的优点:系统结构简单,对部署环境要求不复杂,一般通过镜像交换机或者DNS牵引等方式就可以直接部署。成本低,一般普通的存储型服务器或者高配一点的台式机就可以安装,系统一般售价也比较便宜,几百几千的都有。

        文件型缓存的缺点:缺点有很多,市场上99%的文件型缓存系统都是依赖与用户的重复请求去判断需要存储哪些文件,这需要有庞大的用户基数和大容量的存储空间,而往往对于民营宽带几百 几千用户的网络环境和十几、二十几个TB的存储容量相对于庞大的网络存储数据,基本上是杯水车薪。文件型缓存对于安全443请求无法支持,也就是说https开头的资源是无法缓存和命中的。磁盘的读写速度会限制缓存的输出速度。不论是302重定向、还是DNS牵引都存在一个响应速度的问题,简单来说就是系统的响应速度跟不上用户请求速度,导致用户已经请求完了,这边还没响应到。

        CDN缓存,CDN缓存是基于CDN边缘服务器的形式发展而来的,他最大的特点是不依赖用户的请求而是通过部署在公网的若干节点,数据热度分析,以及源地址的数据镜像方式来存储缓存数据的,简单点说,例如爱奇艺有100部热播影片,通过接节点分发协议将这100部影片分发给CDN缓存服务器,当用户访问这100部影片其中一部时,源服务器会根据用户的来路判断走距离用户最近速度最快的节点服务器获取数据。再简单点来说,你想当与拿到了一条只能访问爱奇艺这100部影片且不限速的外网带宽。当然这只是一个简单的例子。对于存储方面CDN式缓存一般采用存储阵列的方式,存储的数据是以数据流的方式而不是文件的方式保存。

        CDN缓存的优点,不需要依赖用户请求数据来获取缓存数据,可以自动处理热度数据请求,相当于对公网某些特定源进行自动镜像。由于CDN参与了请求链,所以它可以对443的请求进行缓存加速。数据流的存储方式和分布式存储矩阵保证了硬盘的读写性能(读写分离)。不存在命中速度的问题,因为根本没有所谓的命中,CDN缓存是通过源分发处理请求而不是重定向用户的请求。

        CDN缓存的缺点,造价高昂,一般小型的CDN缓存也是由十几台甚至二十几台服务器组成的存储矩阵,对于部署环境的网络结构要求非常高。需要有专业人员进行专业维护,获取数据一般需要与源地址建立专线链路和协议。当然还有更多,就不一一陈述了,我要表达的意思其实就是,CDN缓存都是电信联通这种大哥哥玩的,民营这种小弟弟玩不起。

二、影响文件型缓存速度的因素是什么?

        1、磁盘读写性能是最大因素;

        我们都知道不管是SATA硬盘或者SAS硬盘,不管他们的缓存多大、转速有多高,一个硬盘的最高读写速度是有限的。理论上SATA3.0硬盘的读写速度可以达到600M/s这个数据你是不是觉得很夸张?是的,这实际上是出自实验室特定环境下的一个理论数据,这种数据基本上只是用于论证,存在于技术文档上。在实际应用环境中,受到读写、寻道、CPU繁忙度、主板总线速度等各种因素的影响下,以一个2T 7200转 16M缓存的硬盘它的平均读写速度在200-240M之间,而对于缓存系统应用的环境中(大量的文件和碎片化存储、读写不分离等各种因素)最多也就能到150-180M/s已经是硬盘的极限了,即使SAS万转硬盘也不过比这个数据高出10-20M/s。那么在读写速度已经恒定的情况下,软件算法再怎么高深也是然并卵。

        2、缓存策略的配置错误是第二大因素;

        市场上大多数文件型缓存都提供了缓存策略的配置和调整,一般分为两个大类分别是目标文件类型(例如视频类  下载类 ),触发请求标记数值(比如A文件要请求X次后就被列为缓存目标)。这个策略看似简单实际上真正要做好是需要根据自己的网络特点进行调整的,你怎样去调整也决定了如何有限的资源去获得更大的优化。例如有的人喜欢把几个硬盘做成一个阵列盘,然后所有文件类型都存在这一个大容量阵列盘中,虽然阵列卡对硬盘有一定的优化,但这种优化请不要单纯的理解为速度优化,后面的篇幅我会单独讲讲什么是raid。实际上不管是raid0还是raid5都是把多个硬盘做成一个大容量的阵列盘,但对于磁盘读写速度不是1+1=2,当这种情况下过多的文件存储、过多的读取、写入和查询反而让硬盘速度变得更慢。触发机制的调整同样非常重要,首先我们要知道那些类型的文件需要低触发,哪些类型需要高触发。我曾经见过一个客户,他把所有文件类型的触发都设置为1,意思就是只要有一个用户请求过这个文件就缓存。结果在它的缓存跑了半年以后发现,缓存系统每天都在拼命下载,但输出率和命中率反而很低。这是因为缓存里存储了大量没有重复请求的文件,导致真正有重复性的文件一直被排在队列的最后面反而没有被缓存到。这里我给个建议各位看官可以参考下。例如所有APP商店类的触发设置为1,因为常用的手机应用就那么几十个,这些也应用更新的也勤快,更有甚至天天更新的。视频类设置为3,这样可以过滤掉大量无用请求,让视频类只缓存热播剧(热播剧看的人多,重复请求量大,比如最近我老婆在看的流星花园2018,剧情很吐血但不妨碍就有人看)。各类管家设置为2,例如360管家,腾讯管家之类的,不管你是不是觉得这类软件很流氓,但用它的人很多,设置2这个数值同样可以过滤掉大多数重复性不高的软件。测速类给1,各类测速软件的下载数据量并不大,以360测速为例我们分析发现它只有几百个测速文件,不叨叨全部缓存到本地先。至于其他的例如什么游戏更新包之类的,统统5以上,理由不说全靠经验。

        3、死限速的后果是第三大因素;

        我们为什么要限速,那是因为不同带宽套餐价格不一样,可我就不明白了,你上了缓存是为了提升用户体验减少带宽(减少带宽这个理由很牵强的)你还要去对缓存进行限速?我常说的一句话叫什么来的“脱裤子放屁”。对于我这样一个职业来说,市场上主流和非主流的路由系统或者流控系统基本都算熟悉了。所以有一个特别重要的问题要说明,计费下发限速的优先级最高。也就是说,不管你在系统里做了什么通道、限速策略、分流脚本,计费下发的限速会被以最高级别来执行。例如你计费下发限速为10M,那么这个用户不管从哪条线访问出去都是10M 包括缓存。这样做不单单影响用户的体验,实际上还让缓存的效果大打折扣。所以这里我们要针对自己用的什么样的软件对限速策略进行一定的调整,首先要搞的就是计费不下发限速模板,例如Panabit 碧海威这类就可以这么做可以通过它们自带的限速策略来做动态通道限速,针对缓存不限速等方式,还有些软件支持限速白名单,例如海蜘蛛 WayOS ROS(脚本)等,对于这类软件在保留计费下发限速的同时,可以将缓存的输出IP添加到限速白名单。

三、对于缓存系统的一些谎言和答疑;

        我相信我写这篇文章一定会被友商痛骂,我想说的是,骂我的友商多了,你算老几?

        1、对于输出流量统计的那些猫腻;

        所谓的缓存输出流量高低就决定了缓存系统的性能,正式因为这个因素才让一些不要脸的厂商对这个数据做手脚。之前也曾经有客户问过我这类问题,为啥我的缓存显示命中流量每天几个十几个TB但外网带宽还是用那么多,而且一点感觉都没有?其实这个问题不难解答,前面我们说了文件型缓存是通过302重定向或者DNS牵引的方式来引导用户请求到本地的文件,这个操作说起来简单,做起来很难,因为你要在源地址和目的地址建立连接之前检测到这个请求并急时响应。理想很丰满,现实很骨感,大多数或者说80%的文件型缓存都存在影响速度不够快的问题,这会导致虽然缓存检测到请求,也给予响应了但客户端没收到,还是从源地址下载了文件。那么猫腻来了,有那么一些缓存系统厂商,他们的输出流量统计是以自己响应客户端请求为准,而不是以实际响应客户为准,换句话说,我叫你,你听到没听到不关我事,只要我叫了就算我的流量,你收到没收到不关我事。这就是为啥缓存显示每天输出几十个TB,用户一点感觉没有,该吃的带宽1KB也没少。那么我们应该怎样看缓存的真实流量呢?很简单,让缓存系统自己的统计去见鬼,你就看缓存输出到你路由wan的线路的实时流量(WAN口回流来说),这个才是相对准确的。

        2、阵列卡或者RAID能优化磁盘速度吗?

        答案是不能,我们常见的阵列级别就是RAID0或者RAID5,RAID0偏速度优化,RAID5偏数据安全但损失容量。我们先说RAID0,RAID0是将多个相同接口不同或者相同容量的硬盘组成一个大容量阵列盘,速度是所有RAID中最快的,容量也最大,缺点是数据安全性没有保障,一个硬盘损坏整个阵列盘的数据全部挂掉,我还是要说RAID0虽然偏速度优化但不是1+1=2,并不是1个硬盘200M/s 2个硬盘就变成400M/s,实际使用中RAID0对磁盘IO有一些优化大概能到240-280M/s之间仅此而已,对于RAID0你用多少硬盘组阵列和速度没有直接关系。RAID5,需要最少3个相同容量硬盘组阵列,会牺牲一个硬盘的容量来做数据校验盘,这样有一个硬盘损坏后也不会丢失数据,对于文件读写速度稍微逊色于RAID0,大约在220-260M之间,至于其他RAID级别,别想了都不合适你,如果你一定要做RAID,那就用RAID0,你的缓存不需要数据安全,这对你来说没有意义。什么叫阵列直通卡?抱歉首先这个命名就是不对的,我们以DELL的6/i和6/iR阵列卡做对比,6/i叫阵列卡,支持RAID0-5。6/i叫磁盘扩展卡,它不支持RAID,它的作用就是一个扩展主板上的硬盘接口。准确的说所谓的直通卡,因该叫硬盘接口扩展卡更准确。曾经有个客户打电话给我说,他的缓存系统厂商让他换硬盘直通卡这样速度更快,客户的主板本身集成的是SATA3.0的总线接口,结果非要换SATA2.0的所谓直通卡,这能变快?这个冤大头居然信了。对于这种客户我只能说一句话“Hello 冤大头”

        3、用户量和缓存效果有没有直接关系?

        有,关系非常大,用户量越大文件型缓存的效果越好,但这里的大不是无限大,当用户数超过4K以后对于一台文件型缓存就吃不消了。

        4、缓存需要给独立的线路下载吗?

        需要,而且非常有必要,不但要给独立线路下载缓存,而且线路质量要好,最好公网IP、最好不限连接数、最好带宽要大,如果一条线不够,可以多给几条线路汇聚起来下载。这是为什么呢?答案是队列,不管你的缓存是基于什么操作系统做的,他的下载进程数量都是有限的,一般来说能开100个进程同时下载的已经凤毛麟角,大多数缓存系统只能跑20-50个进程并发,这就产生了一个队列问题,如果你的下载线路不够好不够快,就会导致队列里积攒成千上万的待下载内容,等排到这些文件的时候可能这个文件已经失去热度了,虽然有些缓存厂商通过文件类型和一些判断策略来调整优先级,但当我们面对现实的时候,你在怎么智能也无法控制最终用户喜欢下载哪个文件,所以与其相信缓存厂商那不靠谱的所谓智能优先级策略,还是提升下载线路带宽来的实际一点。

        5、缓存系统真的可以节省带宽吗?

        不能,不要相信这种鬼话,对于文件型缓存来说,你不要指望它给你节省带宽,你只要关注它能不能给用户提升网络体验就可以了,大多数缓存系统能起到作用的一般都是测速欺骗,视频网站的影前广告,以及很少一部分的热门APK和软件下载。至于你关注的其他内容,抱歉不足2%。

        6、缓存对web视频能有多少效果?

        对各大视频网站的影前广告效果非常好,几乎命中率超过80%,对于正片呵呵呵抱歉命中率不足5%,真的甚至更低,这不是危言耸听,我研究HLS技术这么多年,它最吸引我的就是动态切片技术,对于爱奇艺 腾讯视频 优酷这类大站,大多数都采用了这种技术,所谓的动态切片就是根据用户的来路,带宽情况等各种因素,系统会自动制定出一套最合适的切片方案,然后快速生成切片,换句话说,不同用户请求相同的影片得到的切片列表文件大小md5值可能是完全不一样的,为啥有的人装了缓存以后看优酷一快进就卡住,播着播着就黑屏,忽然丢失一段,就是这个原因,但你在承担这些问题的同时,你的缓存系统还在不要命的下载这些永远都不会被命中的文件,是不是很惨?真的很惨。

        7、直播缓存有没有意义?

        没意义,基本上所有的直播类型分为两类,要么是HLS流媒体占70%,剩下的是p2p,p2p你根本缓存不了,谈都别谈。对于HLS Live来说,这个技术我很熟,基于HLS的直播流实际上是一个http请求的索引文件.m3u8,索引文件中会不断更新ts文件列表,ts文件就是真实的直播数据。一般一个ts文件包含5秒左右的直播内容,所有的支持hls的播放器不管是pc端 手机端 tv端都遵循一个协议,只播放最新更新的3个ts文件,也就是说15秒,且不说你的缓存下载这3个ts文件会不会比播放器还快,对于互联网几百个直播软件几万个源,几百万的CDN数据来说,你们觉得靠谱吗?这能有多少重复的可能性。这时候有人说了可以缓存快手 抖音啊呵呵呵呵,我忘记说了对于这类实时直播软件他们用的RTMP协议,RTMP是0延迟的,他们绝对不会用HLS,否则你送了礼物你的小姐姐都对你么么哒了你15秒甚至更长时间才能看到,这要多窝火?还缓存呵呵。

        8、我用户数多,应该怎样部署缓存才合理呢?

        除了我上面说的那些策略设置外,当你的用户数量大于4K的时候就要考虑上多台缓存进行分布式了,不同的缓存服务器去缓存不同的目标源类型,简单点说1台专门缓存APK 1台专门缓存视频 1台专门缓存软件,这样减少一台服务器的文件数量,减少每台服务器的下载队列压力,减少硬盘读写压力才是王道。至于其他方法抱歉没有。

四、总结

        OK,写了这么多,其实更多的我已经不敢写了,毕竟我不想把所有同行的都得罪了。虽然我也没怕过得罪人这件事。要说现在做缓存还有没有必要,要我说其实没什么意义,毕竟文件型缓存的原理和性能就在那里摆着了,有这些闲钱还不如多拿点带宽,目前网络应用其实逐步从PC端转移到了移动端、TV端,我们也测试了很多友商的缓存,对TV端或者手机端,先是能缓存的东西很少,所有APP作者都在想进一切办法去减少用户的流量,别不信这是真的。再者能缓存的往往效果也不好,很多TV端或者手机端的视频应用,要么直播用RTMP,点播用http+p2p双模式的方式,要么就是用443安全连接,说起来Android对重定向请求支持的不太好,APPLE商店还会对双边地址进行检测,只要一端地址不对就拒绝了,这也是为啥用上缓存后有客户反应IOS应用更新不了的问题。那么在没有缓存的情况下如何优化网络呢,其实现在的路由系统都很强大,比如PA或者碧海威都不错,他们的应用路由做的都很好,可以基于IP 应用进行分流,我们完全可以申请一些带有CDN大数据的线路来做,比如用移动线路汇聚起来跑web视频绝对很爽,移动为了省出口带宽跟大部分视频网站都建立了分发CDN速度一流,对于测速类应用我们完全可以通过协议识别对测速类进行不限速或者保证速度的策略并给予最高优先级。现阶段什么东西都成了在线化,1000个终端用户中,你很难找出几个每天大量下载的宅男了,那么对于投资搞缓存系统,还是分析自己的需求改善路由策略,你想怎么做呢?

        本文是TamronOS原创文章,转载请注明出处谢谢。

                                        By:亚洲黑鹰

返回列表

服务咨询热线

0536-8619798

移动服务热线:

13791663000(徐)