swarm源码实现上的几个问题


有如下几处swarm实现不是很理解:

1.swarm join接口实现
目前master分支上的实现是无限循环d.Register(addr)。为什么要循环注册而不是只注册一次?

2.binpack strategy的weighNodes接口实现
在计算node cpu权重这部分,其实接口想实现的是根据cpu核数计算cpu权重。但这里存在两个问题:
其一,docker以及cgroup都不支持cpu核数限制,上层swarm基于cpu核数做权重计算也就无从谈起;
其二,计算cpu权重的代码实现,cpuScore = (node.UsedCpus() + config.CpuShares) * 100 / nodeCpus,cpus代表的是cpu核数,而cpushare代表的是cgroup层面的cpu权重(是一个相对值),这。。。熊+猫=熊猫?
已邀请:

田浩浩 - wizmacau developer

赞同来自:


源码问题你可以请教下@孙宏亮

shlallen - DaoCloud软件工程师,合伙人

赞同来自:


CPU资源,理解起来更多的是一个相对的概念,所以在一台宿主机上,讨论CPU资源是很有意义的;但是集群,或者多台宿主机上讨论各自在整个集群中CPU使用情况时,就会有一些问题,比如说如何把多台机器之间隔离物理CPU的区别都计算进去。目前,我认为还不具有一个较为合理的方式,所以swarm之间只是考虑了CPU这一个点,但是并未拿出让大家信服的方案,看来博主很细致,发现了这一点。

bobliu

赞同来自:


关于join, 你看了docker的discovery包就知道了,注册到服务发现是带ttl的,一但超过阈值后, zookeeper/etcd 的节点信息就会过期实现,所以swarm在设计时,节点采用心跳方式处理,本地间隔发送心跳保持ttl不过期。

要回复问题请先登录注册