Cloud foundry warden源码学习(1)

Cloud Foundy是一个open source的PAAS平台,warden是其运行时应用驻留的容器,和AWS及Asuze不同的是,Cloud Foundry追求所谓的高密度部署,即在每一个虚机节点上,可以部署多个应用。每个应用都会以warden容器的方式和其他应用共享该虚机。最早Cloud foundry是通过LXC实现这一套资源隔离和分享,但是LXC本身提供的能力和Cloud foundry的目标有所不同,从V2开始,Cloud foundry自己利用Linux kernal control group(C-group)技术,实现了一套资源隔离技术。这就是warden。在新的Diego项目中,应该会变成所谓的Garden。

首先看看warden的体系架构



Warden Server面向客户端提供的功能

Create创建一个warden container

Run (spawn + Link) –-handle执行某段bash command

Stop --handle

Destroy --handle

Net-in --handle

Net-out --handle

Copy-in --handle

Copy-out --handle


下面是Runtime的进程结构:



通过pstree看到的进程树



Warden server通过unix socket和客户端相连,对于每一次用户请求(一般是运行某些bash脚本),都会使用DeferredChild方式fork出iomux-spawn进程,iomux-spawn进程中又会fork出另一个子进程wsh。注意是每次请求都会有新的iomux-spawn等一系列进程被创建出来。

wsh进程负责和wshd,也即真正的warden instance server使用unix sockect(形如/var/vcap/data/warden/depot/17r47v9ocsj/run/wshd.sock)通信,同时使用两组pipe和iomux-spawn进程通信,将wsh获取的STDOUT,STDERR发送给iomux-spawn进程。

iomux-spawn进程除了fork一个wsh进程之外,还会pthred_create出5个线程,分别是:

  • muxer-run (wsh STDOUT pipe)和wsh子进程通信,接收标准输入流
  • muxer-accept (unix socket out /var/vcap/data/warden/depot/17vedc80gj3/jobs/54/stdour.socket)和连接来的link请求交互,将接收到的标准输出回写给link
  • muxer-run (wsh STDERR pipe)和wsh子进程通信,接收错误输入流
  • muxer-accept (unix socket out /var/vcap/data/warden/depot/17vedc80gj3/jobs/54/stderr.socket)和连接来的link请求交互,将接收到的错误输出回写给link
  • status-writer-run(unix socket out /var/vcap/data/warden/depot/17vedc80gj3/jobs/54/status.socket) 和连接来的link请求交互,将状态输出回写给link

下面是一个使用wardenclient(runner)的例子

/var/vcap/packages/warden/warden/bin/warden --socket /var/vcap/data/warden/warden.sock  --trace
warden> list
handles[0] : 17r47v9ocsi
handles[1] : 17r47v9ocsh
handles[2] : 17r47v9ocsj
handles[3] : 17r47v9ocsl
handles[4] : 17r47v9ocsn
handles[5] : 17r47v9ocsp
warden> run --handle 17r47v9ocsp --script "ps xf"
  PID TTY      STAT   TIME COMMAND
  128 ?        S<s    0:00 /bin/bash
  129 ?        R<     0:00  \_ ps xf
   29 ?        S<s    0:00 /bin/bash
   31 ?        S<     0:00  \_ /bin/bash
   32 ?        S<     0:00      \_ /bin/bash
   34 ?        S<     0:00      |   \_ tee /home/vcap/logs/stdout.log
   33 ?        S<     0:00      \_ /bin/bash
   36 ?        S<     0:00      |   \_ tee /home/vcap/logs/stderr.log
   38 ?        S<     0:00      \_ /bin/sh .liberty/bin/server run defaultServer
   64 ?        S<l    1:25          \_ /home/vcap/app/.java/jre/bin/java -XX:MaxPermSize=256m -Djava.awt.headless=true -XX:OnOutOfMemoryError=./.buildpack-diagnostics/killjava -Xtune:virtualized -Xmx576M -javaagent:/home/vcap/app/.liberty/bin/tools/ws-javaagent.jar -jar /home/vcap/app/.liberty/bin/tools/ws-server.jar defaultServer
warden> info  --handle 17r47v9ocsp
state : active
host_ip : 10.254.0.33
container_ip : 10.254.0.34
container_path : /var/vcap/data/warden/depot/17r47v9ocsp
memory_stat.cache : 223944704
memory_stat.rss : 93593600
memory_stat.mapped_file : 45498368
memory_stat.pgpgin : 95451
memory_stat.pgpgout : 17927
memory_stat.swap : 0
memory_stat.pgfault : 73742
memory_stat.pgmajfault : 79
memory_stat.inactive_anon : 0
memory_stat.active_anon : 93597696
memory_stat.inactive_file : 183410688
memory_stat.active_file : 40529920
memory_stat.unevictable : 0
memory_stat.hierarchical_memory_limit : 805306368
memory_stat.hierarchical_memsw_limit : 805306368
memory_stat.total_cache : 223944704
memory_stat.total_rss : 93593600
memory_stat.total_mapped_file : 45498368
memory_stat.total_pgpgin : 95451
memory_stat.total_pgpgout : 17927
memory_stat.total_swap : 0
memory_stat.total_pgfault : 73742
memory_stat.total_pgmajfault : 79
memory_stat.total_inactive_anon : 0
memory_stat.total_active_anon : 93597696
memory_stat.total_inactive_file : 183410688
memory_stat.total_active_file : 40529920
memory_stat.total_unevictable : 0
cpu_stat.usage : 90655481463
cpu_stat.user : 3814
cpu_stat.system : 4928
disk_stat.bytes_used : 223223808
disk_stat.inodes_used : 2014
bandwidth_stat.in_rate : 4294967295
bandwidth_stat.in_burst : 4294967295
bandwidth_stat.out_rate : 4294967295
bandwidth_stat.out_burst : 4294967295
job_ids[0] : 39
warden> run --handle 17vedc80gj3 --script "while true; do echo 'here';sleep 3;done"
here
here 

运行完该脚本后,发现多了一组进程24026(iomux-spawn),24027(wsh)和iomux-link(24030),说明每次运行一个bash command都会有iomux-spawn通过wsh连接到warden容器,而且可以看到iomux-spawn有5个线程。(23588-23593)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值