c语言sscanf函数的用法是什么
288
2022-09-08
gpu-admission 源码分析
简介
Gpu-admission提供调度扩展器,基于default-scheduler预选出来的节点,进⾏筛选
因此我们⾸先找到⼊⼝函数,即pkg/predicate/gpu_predicate.go下的Filter函数
pkg/predicate/gpu_predicate.go ⽤于预选出适合的gpu节点(只有⼀个,因此不需要优选)和device,并写⼊到pod的注解中
⽀持两个过滤器,quota和device。以deviceFilter为例
⾸先对默认调度穿过来的node列表进⾏排序。根据每个节点上的pod信息,重新构建node信息。然后按照可使⽤资源由少到多进⾏排序。
接下来调⽤algorithm的Allocate函数为container分配gpu设备。最终将分配的node和gpu信息写⼊pod的annoatation中。
我们重点分析Allocate()函数,进⼊Pkg/algorithm/allocate.go
func (alloc *allocator) Allocate(pod *v1.Pod) (*v1.Pod, error) {
Allocate函数遍历pod的所有container,逐个分配device,实际的分配⼯作是有AllocateOne函数完成,返回选择后的device列表。
我们进⼀步深⼊到AllocateOne函数中
func (alloc *allocator) AllocateOne(container *v1.Container) ([]*device.DeviceInfo, error) {
//尝试分配需要gpu资源的container
//获取该node的总共内存,device的个数等
如果needCores⼩于100,则共享模式为true。
共享模式下,调⽤pkg/algorithm/share.go的Evaluate函数,按照每块device可⽤的core数由少到多的顺序进⾏排序,选出满⾜core和memory的那个device卡
若needcores为100的整数倍,则为⾮共享模式。该模式下,调⽤pkg/algorithm/exclusive.go下的Evaluate()函数为container分配gpu卡。
同样先对本node上的所有gpu按照core的可⽤个数由少到多进⾏排序。然后逐个过滤各块卡。如果是块空卡(即没有应⽤在使⽤它),则加⼊到devs列表中。直到找到n(needcores/100)块空卡.。如果没有找到n块,则失败。
如果是⾮共享模式,记录vcore为100,vmemory为deviceTotalMemory
最后更新本node上的gpu设备已使⽤资源信息。
其他:
pkg/device/deviceInfo.go:
记录gpu设备的id、totalMemory、usedMemory、usedCore。并提供以下三个函数
AddUsedResources // 更新设备的已使⽤core和memory记录;
AllocatableCore() // 获取设备的剩余core
AllocatableMemory() //获取设备的剩余memory
pkg/device/nodeInfo.go:
⽤于构建node信息(每次调度的时候都会调⽤)。遍历节点上的所有pod和每个pod中的container,获取已经分配出去core和memory信息。
初始化每个device的totalMemory是所有内存的平均值,因此gpu-admission假设的前提是node上所有gpu设备的内存是⼀样⼤的。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~