遇见的问题表象

我喜欢直接说问题,然后说方案,干脆利索(既然你已经开始解决资源利用率的问题,说明你已经不是小白了,简单的问题就不说了)
通过yarn 界面的scheduler链接来看队列资源使用情况,尽管你配置了资源可抢占,队列资源也已经超过了100%,但是队列资源还远没有达到配置的最大值,而且还是发现标签下的资源利用率不高、

环境描述

某一天突然发现集群线上作业pending数狂飙到上千个 ,结果发现资源利用率并不高(才70%<降本增效大行其道的今天,老板能忍这个?>),然后发现是因为一个升级导致,分时复用的机器没有申请下来,导致资源紧张触发的这个问题。这个时候几个部门的人都在讨论问题怎么发生的,应该怎么解决问题

头脑风暴

经过我观察分析发现调度也正常啊,为啥作业就分配不上资源呢?然后我就发现pending多的这个队列里的作业级别大多是默认的优先级,然后我就一阵头脑风暴:**是不是因为这个队列作业的优先级太低了,自己队列配置最低可用的资源已经用完了,现在需要给别的队列开始竞争集群的空闲资源了,但是自己的优先级不高,竞争不过其他队列,然后我就开始手动修改几个作业的优先级,从默认改成了VERY_HIGH,瞬间整体利用率打满,pending作业直线下降,集群回归正常。**别人还在讨论各种方案的时候,突然有个人发现集群正常了。。。。。

一劳永逸的方案

作为一个程序员总得想个偷懒的方案啊(之前一个大佬说:一定要让机器比你忙,你不能比机器忙,大佬说话就是有水平哈)。然后我就用go写个小服务程序,让他获取集群上的所有作业,只要某个队列下面处于ACCEPTED的作业超过10个,并且原来的优先级是默认的我就动态提高他的优先级,启动一个定时任务五分钟执行一次,这样既不会有低优先的作业长时间抢不到资源,作业多的时候还提高了资源的利用率(因为抢占更激烈了)

友情提示

这个方案并不一定适合所有人的环境,原因如下

  • 因为有很多人只会提作业,对资源调度并不懂,优先级设置的不合理,也不知道自己的优先级应该设置成哪个级别
  • 有些人很懂资源调度,他们的优先级设置是正常的,如果你给他改掉可能会有问题
  • 由于资源抢占可能导致原本优先级高的作业枪不上资源,导致延迟(我见到这种情况并不多)

如果你也想用这个方案,你可以像我一样,添加个配置,只让go程序监控某个经常出问题的队列,其他队列ignore就可以啦

怎么让集群的资源利用率更高?

答案就是资源超卖

我这个想法的来源是,看到一篇文章写IT之家之前全部在阿里云上,由于阿里云资源超卖比较严重,影响到了用户的体验,不能忍受这个延迟,后来迁到了百度云。
后来我就想看看k8s怎么做的,然后发现就是通过operator虚报资源,欺骗调度器。然后我就在上报心跳的时候加上一个超卖系数,欺骗RM

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐