
2.1.1 局部优化局部优化是基于我司的主要CDN使用情况而产生的一种思路。作为手机生产制造厂商,我们的静态CDN使用场景的核心业务是应用分发类,如:应用商店app分发,游戏中心app分发,版本自升级分发。归纳一下,核心六大业务占据了我司带宽的90%以上,只要把这六大业务的带宽利用率提升上去,我们的带宽利用率就可以得到明显的提升。基于这样一个情况,CDN运维工经常找到核心业务,给一个带宽利用率的指标,让各业务把带宽利用率提升上去。归纳一下,核心思路就是:找到核心CDN使用业务方、分别给他们定好各自的利用率指标、提需求任务、讲清楚优化的价值。在这一阶段优化之后,我们核心业务的带宽突发场景得到收口,整体带宽利用率明显得到提升。




可以观察出一些比较明显的规律性:
3.1.2 成因分析我们的带宽会走出如此趋势,跟它的影响因素有关,下面列出了“显而易见的”一些影响因素。
我们自研算法的核心思路:
算法的注意事项:

4.2.1 使用Prophet预测阈值首先是阈值预测,基于之前做带宽预测的时候也研究过prophet预测,所以最终选择其作为阈值预测的核心算法。其时间序列特性配合突变点的识别非常契合我们的场景,最终的效果也是非常优秀的。如下图(数据已脱敏),除少量特别突发点以外,大部分阈值点基本上落在预测范围内。
最后,阈值预测本身是一种时间序列预测模型,网上也有较多的类似的选型方案,我们使用prophet预测阈值,并且我们也设计了阈值自适应模型,自动扩充带宽阈值,可以一定程度降低阈值偏离风险。所以,我们使用的阈值一般是体量阈值,结合其自适应特性,加上一些干预手段,可以极大的保障我们的调控效果。4.2.2 使用自研算法预测带宽这部分内容在预测部分已经有较为详细的介绍,这里就不再赘述。总体上,还是用最近的带宽,结合历史走势,拟合出未来一段时间的带宽走势,从而预测未来短暂的带宽走势。4.2.3 子模型解决调控问题这里主要是针对预测之后的数据,到控制数据之间的转换,做一些细化处理。对突发、边界、折算、干预等问题给予关注,需要根据业务实际情况做分析和应对。4.2.4 流控SDK问题研究发现,许多业务可能都存在可控制的带宽,基于此,我们统一做了一个流控SDK。把更多带宽纳入管控,控制的带宽体量越大,带来的效果相对会更好。这里的SDK本质还是一种令牌桶技术,通过此SDK完成所有带宽的统一控制,可以大幅度减少各个业务处理带宽问题的烦恼。4.3 精细化控制能力阈值预测之后,到最后控量,期间存在较大的转换关系,可能还需要进一步思考和优化才能让带宽利用率得到较大的提升。本节例举了我们遇到的挑战,针对我们流控问题,做了些例举,并做了些分解说明。
4.3.1 多CDN数据源问题一般公司会对接多家CDN,各家CDN分配一定的量级,部分CDN不提供最近数据的拉取能力,或者对频率限制太严重,导致数据拉取困难。我们的解决思路:找一家比例相对尚可 且 数据拉取相对配合 的厂商, 用他们的数据和比例反推公司总带宽,减少对其它CDN厂商的依赖。注意:因为公司业务多,小业务不支持多CDN比例调控能力,会导致这个比例存在波动,波动太大的情况下会导致调控失真,会导致你的利用率受损。4.3.2 大小文件引起带宽控制不准限流时,一般只能控制开始下载,但是一旦开始下载,不知道什么时候才会下载完成。小文件,下载耗时较短,控制精准度较高。(常见的小文件、小资源下发等。)大文件,如系统升级包,3G的包,下载可能要一小时以上,控制下载开始是会出问题的。下载时长引起的长尾会让你绝望。我们的解决思路://初始化和扣减CDN流量的LUA脚本
// KEY1 扣减key
// KEY2 流控平台计算值key
// ARGV1 节点个数 30 整形
// ARGV2 流控兜底值MB/len 提前除好(防止平台计算出现延迟或者异常,设一个兜底值),整形
// ARGV3 本次申请的流量(统一好单位MB,而不是Mb) 整形
// ARGV4 有效期 整形
public static final String InitAndDecrCdnFlowLUA =
"local flow = redis.call('get', KEYS[1]) " +
//优先从控制值里取,没有则用兜底值
"if not flow then " +
" local ctrl = redis.call('get', KEYS[2]) " +
" if not ctrl then " +
//兜底
" flow = ARGV[2] " +
" else " +
" local ctrlInt = tonumber(ctrl)*1024 " +
//节点个数
" local nodes = tonumber(ARGV[1]) " +
" flow = tostring(math.floor(ctrlInt/nodes)) " +
" end " +
"end " +
//池子里的值
"local current = tonumber(flow) " +
//扣减值
"local decr = tonumber(ARGV[3]) " +
//池子里没流量,返回扣减失败
"if current <= 0 then " +
" return '-1' " +
"end " +
//计算剩余
"local remaining = 0 " +
"if current > decr then " +
" remaining = current - decr " +
"end " +
//执行更新
"redis.call('setex', KEYS[1], ARGV[4], remaining) " +
"return flow";
如图是除权之后的带宽走势。从图中可以看出,使用《愚公平台》调控带宽,CDN带宽利用率显著提升。
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
如果我一直输入geminstallrails使用不同版本的Rails会怎样?例如,我可以输入:geminstallrails--verson3.2.10或geminstallrails这给了我版本3.2.12。问题每次安装都会覆盖之前的吗?它会删除所有旧文件并添加我正在安装的新版本吗?或者如果我运行它两次,它会保留一些文件吗?我正在使用Ubuntu。 最佳答案 它将安装两个独立的gem。实际的可执行文件rails将调用最新版本。你可以覆盖它__例如,rails_3.2.10_将执行Rails3.2.10。bundler顺便说一下,如