CloudFoundry DEA运作源码分析

DEA各种模型原理及stata代码实现 DEA各种模型原理及stata代码实现DEA各种模型原理及stata代码实现一、CCR和BCC1.原理2.效率测算stata代码3.Malmquist指数3.1M指数3.2Global-Malmquist指数4.指数计算代码与案例二、SBM模型1.原理2.stata代码实现三、方向性距离函数(DDF)1.原理2.stata代码实现3.非径向DDF模型(NDDF)3.GML指数4.指数测算四、总结 DEA各种模型原理及stata代码实现 一、CCR和BCC 1.原理 CCR模型产出导向下的效率通过求解以下规划 阅读详情

这篇文章结构比较糟,我在http://lory-yang.com/2012/09/09/cloud-foundry-dea/中做了一些改进,可以去那里看看。另外我的博客整体搬迁到独立地址了:lory-yang.com,欢迎大家来访问

本文是对Cloud Foundry中的DEA组件源码的一些分析。有点流水帐的感觉,就事论事吧,同时因为本人能力有限,而且研究不深,错误在所难免。诸位就随便看看,希望大家能获得些帮助。有关Cloud Foundry的基础知识可以参考:http://qing.weibo.com/2294942122/88ca09aa330004r8.html, http://qing.weibo.com/2294942122/88ca09aa33000975.html

和其他模块一样,DEA也是使用ROR的目录组织方式,主要代码均集中在lib文件夹中,而在config文件夹下面有一个yaml配置文件。

yaml配置文件:

可以看到文件里面的注释相当完善了,配置的项基本上都可以看懂的。

1. lib文件夹中的代码:

精简版:这是下面所有内容的简单描述:

DEA通过dea.rb来启动,dea.rb调用agent.run来启动DEA服务。DEA启动时会向NATS订阅所有自己需要的消息,然后当消息传来时,进行相应的处理,包括status、start、stop、discover、heartbeat等各种处理。droplet在DEA中的运作主要是:首先将staged file拿过来,然后解压至instance目录,最后执行其中的startup脚本,停止则执行stop脚本。

接下来是比较详细的介绍:

1.1 dea.rb

dea.rb相当于一个启动dea的脚本,里面内容相当简单。主要就是负责config,这些config可以来自于config文件,比如yaml文件,或者传入的opts。然后就new了一个agent对象,调用run函数。这个agent就会负责处理所有的DEA承担的任务。

其中EM就是Event Machine,简单讲就是一个基于事件的工具,可以用来网络编程和并发编程。它主要的特色是免去了并发编程的繁杂,同时提供了易用的网络通讯接口。可以看这里:http://www.infoq.com/cn/news/2008/08/eventmachine

然后看lib文件夹,总共有三个文件,其中一个就是agent,另外两个是secure和directory。

1.2 secure:

暂时没有深入研究secure问题,所以DEA中的所有的secure环节会被略去。从大致的功能上讲,secure就负责划分user和group,每次的操作会验证用户所在的组的权限。同时创建的app也会chown给特定的group。

1.3 directory:

directory利用Rack::File提供了一个对root目录的定制访问功能,在agent中只有一个地方用到,就是start_file_viewer函数,这个函数的注释表示:This is for general access to the file system for the staged droplets。也说的很明白了。在DEA start时,会让EM去不断地启动droplets的文件访问,Periodically try to start the file viewer in case of port contention。

1.4 agent:

这个文件非常长,但是结构其实比较简单。各种参数大部分也能了解其含义了,这里也不说了。主要看agent类的结构。

首先当然有构造函数,主要就是设置参数,就是DEA环境的各种配置,没有其他好说的。

1.4.1 run函数

然后是run函数,我们知道了dea.rb文件中就是调用了这个run函数,那么说明这个函数可以把DEA启动起来,开始为CF提供服务了。这里是整篇文章的一个重点了,我们仔细的看下去:

  1. 创建一个pid file,就是创建一个process id,当前这个DEA就是使用这个id标注了。
  2. 配置了一些参数,这个就略去了。
  3. 在180行创建了所有需要的路径,有兴趣可以全部用log打出来看看。
  4. 将staged dir清除干净,这个dir就是用来存放被打包(staged)的droplet。
  5. 然后可以看到上面提到的start_file_viewer,开启staged dir的文件访问
  6. ['TERM', 'INT', 'QUIT'].each { |s| trap(s) { shutdown() } }

     如果EM捕捉到这些信号,就shutdown
  7. 然后就是最重要的开启NATS服务了,大部分的CF模块都通过NATS交互,NATS是一个消息中间件,用来订阅和发布JSON格式的消息。首先将自己注册到Component中,然后可以获得Component提供的uuid。然后就向NATS订阅了一堆的消息,每个消息都是DEA可以提供的一个功能,其他组件如果需要使用DEA的某个功能,就只需要向NATS发布一个相对应的消息即可。文章后面会对其中几个复杂的功能做一些介绍。
  8. 由于是启动,所以要恢复已经存在的droplets删除不需要的instances
  9. 向EM添加了定时运行的事件,比如heartbeat之类的。
  10. 最后向NATS发布一个dea start消息就算启动完成了

2. DEA的各个主要功能

接下来是DEA向NATS订阅的一些消息以及处理函数

2.1 dea.uuid.start:启动一个droplet的instance

就是让dea启动一个droplet,对应函数是process_dea_start,start函数也比较长,慢慢看。

  1. 从message里面解析出n多的参数,基本上就是droplet和app的一些参数。
  2. 做一些mem和fs usage的判断,是否有足够的mem和disk
  3. 接下来可以看到:
          tgz_file = File.join(@staged_dir, "#{sha1}.tgz")
          instance_dir = File.join(@apps_dir, "#{name}-#{instance_index}-#{instance_id}")
    这个tgz_file就是staged droplet。sha1当初研究了很久,不解其意,这里可以看到其实就是droplet的一个标识,目前手头没有实例可以验证,但是app的目录名称应该也和这个sha1相关。
  4. 然后创建了一个instance的map,这个map包含了instance的所有信息,然后处理了一下DEA自己的域。
  5. 然后可以看到一个lambda: start_operation。顾名思义就是用来start一个instance的。前面都是一些特殊的配置,暂时不研究了,看主要部分:line 669,这里将DEA项目的bin目录下的close_fds文件拷贝至instance目录下,然后执行,看字面意思是prepare。line697: 获得一个app_env数组,就是instance的一些环境变量,后面会把每个值都export。line 719,就是启动instance的代码了,可以看到只是简单的调用了startup脚本而已,这个脚本就是在stage的时候由stager加入的启动脚本。
  6. 然后启动了一个纤程Fiber,首先将staged文件放置到staged dir中(如果有cache最好,否则会去shared folder取,或者会HTTP去读),然后调用start_operation lambda。

2.2 dea.status&droplet.status:查看状态

这两个比较简单,就是把一些状态的字段(name, host, port, mem, disk, uri...)返回回去。

2.3 dea.discover:发现DEA

意思就是当一个droplet需要一个instance时,cloud controller会向NATS广播dea.discover消息,那么DEA收到之后,会根据自己情况选择是否回复此消息。当CC受到第一个回复时,就是用发送这个消息的DEA创建instance。

我们可以看到process_dea_discover这个函数首先主要判断是否能够跑这个app,包括mem、disk、runtime等限制条件。然后会根据DEA当前的情况计算一个delay,然后在delay之后发送response。这个delay相当于在做balance,比如:一般mem使用量大的DEA会delay比较长,所以比较难以被选中。

2.4 dea.find.droplet:查找droplet

很简单,就是通过droplet id查找对应的droplet信息

2.5 dea.update:更改droplet的URI

就是message中包含了droplet id,然后一个uri,那么DEA会修改droplet当前的uri,然后去router做修改

2.6 dea.stop:停止droplet的instance

通过message中指定的droplet id找到droplet,然后根据其余的信息(version, instance id, index, state)filter instance,将这些filter出来的instances停掉。 stop instance流程:首先从router unregister,然后向NATS发布本instance stop的消息,然后调用instance目录下的stop脚本来停止instance,最后将instance目录清理干净

2.7 router.start:向router注册

这里涉及到router的运作方式,router也是通过NATS和其他组件协作的,也就是发布router.start来告诉别人router已经就位,你们可以来注册了。为了应付任何时候可能加入的组件,router会不断地发送router.start消息。而dea中也会每次都傻傻的接受到router.start信息,同时做出处理。所以可以看到dea.log里面会有大量的“DEA received router start message”字段。恩,看起来这么做还是有必要的。我们设想重启了router,那么router必须重新要求所有app来注册,那么他也只能发一个router.start,如果dea做过一次就不做了,那么新的router就无法更新了。

然后处理router.start的过程很简单,就是将所有running的组件注册到router中去。

其他的就不提了,也比较简单,什么heartbeat之类的,大家都懂的

(这里还有一块内容需要补充,就是定期执行的一些操作,比如app状态(CPU,内存等)的update等,还是有一定学习意义的)

CloudFoundry基础知识学习 1     CloudFoundry简介 CloudFoundry是VMware旗下子公司Pivotal的一款开源PaaS产品,是一个由多个独立子系统组成的分布式系统,能偶支持多种运行时环境、开发语言、框架及服务,可以构建于IaaS平台之上,也可以直接部署于物理机器上,总共有两个版本分别是V1和V2,V2版本采用的更为成熟的架构思想,引入了如Buildpack、Warden等强大灵活的组件。 阅读详情

相关推荐

dea的基本MATLAB程序

用于一般DEA的MATLAB编辑,主要包含BCC和CCR模型。

DEA基础模型python代码

DEA是数据包络分析()的简称,是通过数学规划模型得出效率的非参数方法,不需要对生产函数的形式进行假定。以上文字是截取自吴杰老师的《行业分析视角下中国区域环境效率研究——基于数据包络分析(DEA)方法》中的描述。(其实我的理解就是初中就学过的不等式组,只不过没有具体数字了,求最佳值也跟以前在可行域内求最大最小值的思想一样。) 吴杰老师这本书对于刚接触DEA方法的人来说真的很友好,各种基础模型之间的联系和区别都写的很清楚,不过要是想了解最新的模型,还是建议去看最新的英文文献哦。

weixin_63461935的博客 3402

超效率DEA代码文件及说明文档

DEA 是由 Charnes 等人于 1978 年首次提出的, 第一个 DEA 模型为 CCR 模型。 它的优点非常明显, 如指标数据无需 量纲化, 决策者无需掌握决策单元 (DMU) 的内部生产机制, 只需要投入和产出数据就可以对DMU 进行效率评价。

DEA数据包络分析python代码记录

DEA数据包络分析python代码记录

m0_59179752的博客 5095

数据包络法(DEA)matlab代码

数据包络法(DEA)matlab代码,计算方案的相对有效率和各项指标的权重

dea模型matlab代码,三个dea模型,超效率dea,BCC,CCR

里面有三个dea模型,投入型,产出型,超效率,都是matlab代码,打开设置下变量就可以用,希望大家共同进步!

STATA DEA代码说明及样本数据

STATA_DEA代码说明及样本数据

m0_71334485的博客 2422

非期望产出EBM模型效率测算DEA方法EBM模型计算的matlab代码,里面有详细的使用步骤,有问题可以优快云私信我,包售后哦

EBM模型是一个综合考虑径向和SBM两类距离函数的混合模型。该模型不仅解决了传统数据包络分析方法未考虑松弛变量,以及损失效率前沿投影值原始比例信息的缺陷,而且解决了对多个处于前沿位置的决策单元进行比较问题,为决策单元效率测算提供了一种新方法。 为了照顾不懂matlab的小白,本人还整理了详细的操作说明文档,从matlab安装到代码的使用步骤,均做了详细的图文说明,里面还有配套的示例数据,可跟着说明整体跑一遍,就能学会操作!一切只为大家能更好的使用。有问题优快云私信我哦

CloudFoundry之DEA源码分析

DEA启动分析 ruby的代码结构一般都是一样的: bin目录是执行文件 conf是配置文件 lib则是ruby source spec放置一些测试的文件 Gemfile+Gemfile.lock为bundler服务,让dea可以找到正确的gem依赖 Rakefile是用来做测试的 先看下dea的目录结构,bin 放的是脚本,等同shell的

K_James的专栏 2428

dea模型matlab代码_dea模型代码_MATLAB的DEA代码_非期望工具箱_

同样是DEA模型,这个包含有非期望产出的部分,使用时可以直接将数据粘贴到相应位置即可。代码中有注释,非常清楚。

Aspen Plus下载教程Aspen Plus V14 保姆级安装步骤(附安装包)

26、在WlmAdmin界面中,依次点击【Subnet Servers】、【admin】、【Add Feature】、【From a File】、【To Server and its File】。35、在产品选择页面,勾选需要安装的所有产品(重要:不要勾选【Aspen Online(Plant Data)】),然后点击【File Location】。回到桌面,点击任务栏的【开始菜单】,在【所有应用】中找到【Aspen Plus V14】软件图标,将其拖到桌面上创建快捷方式。9、这里可以更改软件的安装位置。

ps_xiaowang的博客 1万+

cloudfoundry dea 之 app staging

DEA,即Droplet Execution Agent,管理app实例,将状态信息广播出去。比如我们创建一个app,实例的创建命令最终会下发到DEA,DEA调用warden的接口创建container,如果用户要删除某个app,实例的销毁命令最终也会下发到DEA,DEA调用warden的接口销毁对应的container。

jasson的专栏 765

MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)

目录 MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载) MQTT(二)在windows64位上安装Python环境 MQTT(三)Python客户端+net客户端+net服务端 简单通信 MQTT(四)树莓派开机自动运行Python客户端 MQTT(五)EMQ开源MQTT消息服务器 1 什么是 MQTT ? MQTT(Message Que...

pw的博客 10万+

CloudFoundry源码分析:DEA

DEA(Droplet Execution Agent),主要流程都在agent.rb文件中实现。 由于CloudFoundry平台是以NATS为中心的,只要弄清楚了这个组件能够处理的NATS消息,也就清楚了这个组件的基本流程。DEA也不例外。 Agent主要注册了以下几种事件,下面分别介绍这些方法的实现流程 。 NATS.subscribe('dea.s

Tony的专栏 1461

python模拟银行交易流水

模拟自动生成银行交易流水,其中包括:入账账号、出账账号、交易金额、交易余额、交易时间、出入表示关键字段

qq_31823889的博客 2910

LS-DYNA壳单元冲击仿真中的5个关键设置:以方管碰撞为例(含沙漏控制参数)

本文以方管碰撞为例,深入解析了LS-DYNA壳单元冲击仿真中的五个关键设置。重点探讨了沙漏控制参数(如IHQ=4)的选择逻辑、自接触算法优化、能量监控方法、材料模型(MAT_24)的真实应力-应变曲线与应变率效应设置,以及单元公式的选取。这些核心设置共同决定了仿真的精度与效率,是确保方管冲击仿真结果可靠性的基石。

salt的博客 626

cloud foundry之dea组件源码分析

上一篇文章分析了router的运行原理,在这一篇开始分析dea组件的运行。。。,记得以前自己刚刚开始接触cloud foundry的时候就会觉得dea是最神奇的一个模块,不过看了它的代码之后它的神秘感也就渐渐的消失了。。 首先来看启动的代码:EM.run { agent = DEA::Agent.new(config) agent.run() }还是在eventmachine中启动,主要

fjs的专栏 2481

SGX软硬件栈(二)——硬件指令

硬件指令分为内核权限硬件指令和用户权限硬件指令。内核权限硬件指令指的是指令需要通过内核态下才能访问,缩写是ENCLS。用户权限硬件指令指的是指令用户态下便能访问,缩写是ENCLU。每一个具体的功能指令被称为叶功能,如EADD叶功能,因为叶功能之间的区分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在输入时都是用作叶功能号。 内核权限硬件指令-ENCLS 如图2所示,SGX 1代指令中,ENCLS主要用于管理Enclave生命周期等。比如下文将介绍的Enc

小气球归来的博客 2890

CloudFoundry dea实践经验

CloudFoundry dea实践经验分享下使用CF过程中一些经验:查询所有dea的容器个数curl router:c1oudc0w@ROUTER_IP:PORT/routes | python -mjson.tool | grep DEA_IP | wc -l ++note:其中ROUTER_IP是gorouter的Ip,PORT是gorouter查询状态的那个端口,DEA_IP是待查询的dea

wenhao的专栏 598

第十篇|网络子系统 ②——无损以太网、PFC/ECN、DCQCN 与拥塞可视化

网络部分了解了解

qq_37535542的博客 1874

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 61

Cloud Foundry中DEA与warden通信完成应用端口监听

在Cloud Foundry v2,DEA为一个用户应用运行的控制模块,而应用的真正运行都是依附于warden。更具体的来说,是DEA接收到Cloud Controller的请求;DEA发送请求给warden server;warden server创建warden container并将用户应用droplet等环境配置好;DEA发送应用启动请求至warden serve;最后warden container执行启动脚本启动应用。 本文主要具体描述,DEA如何与warden交互,以保证最终用户的应用可以成功

木精灵的技术博客 3927

innovus:Clock Gating Check设置与报告

看图后发现,在设置clock gating check之前报告也会有clock gating check的值,这个就是因为timing library中会像reg一样定 library setup time值,如下图。我们常用set_clock_gating_check -setup去过约束Place阶段reg2cgate的时序,以防CTS后由于tree不平导致的时序违例。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1013

Cloud Foundry中DEA组件内应用的启动与资源监控

Cloud Foundry中所有的应用都运行在一个称为DEA的组件中,DEA的全称是Droplet Execution Agent。 DEA的主要功能可以分为两个部分:运行所有的应用,监控所有的应用。本文主要讲解Cloud Foundry v1版本中DEA如何启动一个应用,以及DEA如何监控应用的资源使用。虽然DEA两个功能的实现远不止这么多,但是笔者认为启动应用和监控应用资源是DEA的精髓所在,很多其他的内容都是在这两个点上进行封装或者强化。

木精灵的技术博客 4443

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

详解CloudFoundry中各个组件的作用

CloudFoundry是一个标杆性的项目,架构设计上有很多值得借鉴之处。从CloudFoundry官网摘了一张图,我们以此剖析各个组件的作用。 Router Router是整个平台的流量入口,负责分发所有的请求到对应的组件,包括来自外部用户对app的请求和平台内部的管理请求。 Router是PaaS平台中至关重要的一个组件,它在内存中维护了一张路由表,记录了域名与实例的

zbq928171481的专栏 1434

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: Openshift源码与运作方式初步分析
下一篇: cloudfoundry dev setup 分析以及chef学习
Lory_yang
博客等级 码龄18年 48粉丝 69原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值