gpu-admission 源码分析

网友投稿 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小时内删除侵权内容。

上一篇:云原生:二进制部署单master k8s集群
下一篇:固安捷营销总裁朱晓东:新的季度我们将走得更远!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~