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模型,这个包含有非期望产出的部分,使用时可以直接将数据粘贴到相应位置即可。代码中有注释,非常清楚。

电压电流双闭环PFC单相PWM整流

电压电流双闭环PFC单相整流。仿真及代码

xht2403267701的博客 6052

cloudfoundry dea 之 app staging

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

jasson的专栏 765

(详细总结)python爬取 163收件箱邮件内容,收件箱列表的几种方法(urllib, requests, selenium)

需求:最近有一个需求,需要将163邮箱收件箱里面的所有邮件的内容全部copy下来,整理到一个word里面,不多也就28页的邮件(不要问我为什么有这需求,不告诉你),自己手动去ctrl+ cv 的话,估计要搞吐。然后就想能不能用python的爬虫来实现,虽然过程比较苦(后期改bug改的要吐了)。但是会后还是将需求实现了。这基本也算是入门了 urllib、requests、selenium这几个py...

man_tou_22 1万+

CloudFoundry源码分析:DEA

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

Tony的专栏 1461

TSC条码打印机C#例程(tsclib.dll调用) 【转】

//----program.cs using System;using System.Collections.Generic;using System.Windows.Forms; using System.Runtime.InteropServices;public class TSCLIB_DLL{[DllImport("TSCLIB.dll", EntryPoint = "abou...

weixin_33843947的博客 2442

Selenium自动化测试遇到shadow-root元素?3种实用解决方案帮你搞定

本文针对Selenium自动化测试中遇到shadow-root元素难以定位的常见问题,提供了三种实用的解决方案。详细阐述了通过JavaScript直接穿透Shadow DOM、利用浏览器工具快速获取JS Path以及使用Python第三方库进行优雅封装的方法,并分享了提升脚本健壮性的实战策略与最佳实践,帮助测试人员有效应对现代Web组件化开发带来的挑战。

code8的博客 408

cloud foundry之dea组件源码分析

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

fjs的专栏 2481

基于CANopenNode协议栈在正点原子探索者开发板上进行移植

配置好之后进行采用keil IDE进行代码生成即可,还需要进行CANopenNode的代码集成,并参照demo进行代码移植。发送完成后心跳包以1s的周期重新开始发送。正点原子的开发板引出的是CAN1接口。这里的心跳时间间隔设置为100ms。则将心跳包周期设置为0。

wangfandashe的博客 4701

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

SDFCOM_SWC警告深度剖析:从assign短路到时序标注失效的链路追踪

本文深入剖析了SDFCOM_SWC警告的根源,从assign短路到时序标注失效的全链路追踪。通过分析RTL设计中的assign语句陷阱、综合阶段的优化变形以及PrimeTime生成SDF文件的视角,提出了重构RTL设计、警告抑制和SDF生成优化等解决方案,帮助工程师有效避免时序标注问题。

weixin_42519985的博客 365

activiti(六):activiti7的数据表和字段的解释

介绍activiti7的数据表和各表字段的含义,对于学习activiti7工作流引擎的运行过程很有帮助!

no problem的博客 1万+

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

【STM32项目】老人健康跌倒检测系统实现(附教程PCB资料)

功能概述 跌倒检测 倾倒告警,人体角度倾斜至阈值触发蜂鸣报警 异常运动,加速度超过正常行动阈值时触发报警 心率监测 实时检测心率数据 血氧监测 实时检测采集血氧 血压测量 血压在线测量 红外体温 非接触体温采集方案 接触式体温采集方案 实时定位 中科微GPSGT-U12双频GPS北斗 GLONASS IRNSS定位系统 NEMA数据解析 可扩展高精度定位方案厘米级 屏幕显示 数据采集显示 告警阈值设置 语音提示 1欢迎使用老人智慧监测系统

洋洋的博客 1万+

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

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

木精灵的技术博客 4443

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

详解CloudFoundry中各个组件的作用

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

zbq928171481的专栏 1434

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 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、付费专栏及课程。

余额充值