首页 > 其他分享 >容器资源分配

容器资源分配

时间:2023-12-20 14:46:40浏览次数:32  
标签:容器 pq 16 int 虚拟机 func cpuCore 资源分配

题目描述

容器化是当前云化趋势下的一种重要技术,容器运行需要足够的CPU资源,请实现一种CPU分配机制,满足如下设计要求:
image.png

  • 假设所有虚拟机的 CPU核数都为 cpuCore 。
  • 为了满足可靠性要求,每个虚拟机上最多部署 2 个容器;一个容器占用一定数量的 CPU 核数,一个虚拟机上容器占用的CPU核数总和不能超过 cpuCore 。

现有 A、B 两个业务,每个业务都有一个或多个微服务,每个微服务独占一个容器:

  • 承载业务A 的每个容器需要的CPU核数记录于 serviceA 中,serviceA.length 为容器数量,serviceA[i] 表示容器 i 所需的CPU核数。业务B 的信息 serviceB 含义同理。
  • 业务A 需要支持反亲和策略,即业务A 的任意两个容器不能运行在同一个虚拟机上;业务B 不需要反亲和。

请计算最少需要多少个虚拟机才能满足这两个业务的资源要求?

解答要求时间限制:800ms, 内存限制:256MB 输入

首行三个整数cpuCore serviceA.length serviceB.length
第二行是 serviceA
第三行是 serviceB

2 <= cpuCore <= 1000
1 <= serviceA.length, serviceB.length <= 10^5, 1 <= serviceA[i], serviceB[i] <= cpuCore

输出

一个整数,表示最少需要多少个虚拟机

样例

输入样例 1 复制

32 3 2
16 8 16
2 7

输出样例 1

3
提示样例 1
  • 每个虚拟机的CPU核数固定为 32, 业务A 的 3 个容器的CPU核数需求为 16、8、16,业务B 的 2 个容器的CPU核数需求为 2、7 。

  • 由于A业务的反亲和要求,需要虚拟机的数量至少和A业务容器数相同,即 3 个;其中一种利用 3 个虚拟机满足CPU资源需求的分配方案为:
    虚拟机1:(A:16,B:2)
    虚拟机2:(A:8,B:7)
    虚拟机3:(A:16)

注意:每个虚拟机最多部署2个容器



输入样例 2 复制

64 3 5
32 8 16
32 16 54 16 16

输出样例 2

4
提示样例 2

最少需要 4 个虚拟机。可以有多个分配方案,其中之一:
虚拟机1:(A:32,B:32)
虚拟机2:(A:8,B:54)
虚拟机3:(A:16,B:16)
虚拟机4:(B:16,B:16)

 

 

 

###########别人AC的############

package main

import (
    "container/heap"
    "fmt"
    "sort"
)

type Item struct {
    value    int
    priority int
    index    int
}

type PriorityQueue []*Item

func (pq PriorityQueue) Len() int { return len(pq) }

func (pq PriorityQueue) Less(i, j int) bool {
    return pq[i].priority > pq[j].priority
}

func (pq PriorityQueue) Swap(i, j int) {
    pq[i], pq[j] = pq[j], pq[i]
    pq[i].index = i
    pq[j].index = j
}

func (pq *PriorityQueue) Push(x interface{}) {
    n := len(*pq)
    item := x.(*Item)
    item.index = n
    *pq = append(*pq, item)
}

func (pq *PriorityQueue) Pop() interface{} {
    old := *pq
    n := len(old)
    item := old[n-1]
    old[n-1] = nil
    item.index = -1
    *pq = old[0 : n-1]
    return item
}

func getLeastVmNum(cpuCore int, serviceA []int, serviceB []int) int {
    result := len(serviceA)
    queue := make(PriorityQueue, 0)
    heap.Init(&queue)
    for _, a := range serviceA {
        if a < cpuCore {
            heap.Push(&queue, &Item{
                value:    cpuCore - a,
                priority: cpuCore - a,
            })
        }
    }
    sort.Slice(serviceB, func(i, j int) bool {
        return serviceB[i] > serviceB[j]
    })
    for _, b := range serviceB {
        if queue.Len() == 0 || queue[0].priority < b {
            result++
            heap.Push(&queue, &Item{
                value:    cpuCore - b,
                priority: cpuCore - b,
            })
        } else {
            heap.Pop(&queue)
        }
    }
    return result
}

func main() {
    fmt.Println(getLeastVmNum(64, []int{32, 8, 16}, []int{32, 16, 54, 16, 16}))
    //fmt.Println(getLeastVmNum(2, []int{2}, []int{1}))
    //fmt.Println(getLeastVmNum(8, []int{3, 4, 5, 2, 3, 5, 2, 3, 4, 1, 8}, []int{3, 2, 1, 3, 2}))
}



// demo2



package main

import (
    "container/heap"
    "fmt"
    "sort"
)

type Item struct {
    value    int
    priority int
    index    int
}

type PriorityQueue []*Item

func (pq PriorityQueue) Len() int { return len(pq) }

func (pq PriorityQueue) Less(i, j int) bool {
    return pq[i].priority > pq[j].priority
}

func (pq PriorityQueue) Swap(i, j int) {
    pq[i], pq[j] = pq[j], pq[i]
    pq[i].index = i
    pq[j].index = j
}

func (pq *PriorityQueue) Push(x interface{}) {
    n := len(*pq)
    item := x.(*Item)
    item.index = n
    *pq = append(*pq, item)
}

func (pq *PriorityQueue) Pop() interface{} {
    old := *pq
    n := len(old)
    item := old[n-1]
    old[n-1] = nil
    item.index = -1
    *pq = old[0 : n-1]
    return item
}

func getLeastVmNum(cpuCore int, serviceA []int, serviceB []int) int {
    sort.Ints(serviceA)
    sort.Ints(serviceB)
    queue := make(PriorityQueue, 0)
    heap.Init(&queue)
    result := len(serviceA)
    for _, a := range serviceA {
        if cpuCore-a > 0 {
            heap.Push(&queue, &Item{
                value:    cpuCore - a,
                priority: cpuCore - a,
            })
        }
    }
    for i := len(serviceB) - 1; i >= 0; i-- {
        b := serviceB[i]
        if queue.Len() == 0 || queue[0].priority < b {
            result++
            heap.Push(&queue, &Item{
                value:    cpuCore - b,
                priority: cpuCore - b,
            })
        } else {
            heap.Pop(&queue)
        }
    }
    return result
}

func main() {
    fmt.Println(getLeastVmNum(64, []int{32, 8, 16}, []int{32, 16, 54, 16, 16}))
    //fmt.Println(getLeastVmNum(2, []int{2}, []int{1}))
    //fmt.Println(getLeastVmNum(8, []int{3, 4, 5, 2, 3, 5, 2, 3, 4, 1, 8}, []int{3, 2, 1, 3, 2}))
}
View Code

 

感受:

1. 读懂题了吗?

2. 先求A的总和,因为A互斥

3. 再求空余的位置是否能容得下B么?如果容得下,就直接跳过,容不下就结果+1,并把剩余的结果重新放入队列

 

 

标签:容器,pq,16,int,虚拟机,func,cpuCore,资源分配
From: https://www.cnblogs.com/gongxianjin/p/17916468.html

相关文章

  • docker容器单机编排
    随着网站架构的升级,容器也使用的越发频繁,应用服务和容器间的关系也越发复杂。这就要求研发人员能够更好的方法去管理数量较多的容器服务,而不能手动的去挨个管理。例如一个LNMP的架构,就得部署web服务器,后台程序,数据库,负载均衡等等都需要统一部署在容器里,那么这时候就需要使用统一......
  • 容器docker技术
    我们先看看很久很久以前,服务器是怎么部署应用的! 由于物理机的诸多问题,后来出现了虚拟机。 但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道一定程度时,操作系统本身资源也就消耗殆尽,或者说必须扩容。例如上一篇,超哥讲解的kvm,你所......
  • [Unraid 系列 v6.10+] 9 安装 qbittorrent 容器
    说明Unraid建议使用ComposeSTACK进行管理。初始创建docker-compose.yml:version:"3"services:qbittorrent:image:linuxserver/qbittorrentcontainer_name:qbittorrentenvironment:-PUID=99-PGID=100-TZ=Asia/Sh......
  • 独家好书丨《智算时代的容器技术演进与实践》免费下载
    2023云栖大会容器服务ACK分享实录合辑《智算时代的容器技术演进与实践》电子书正式上线!10+云栖精选议题带你深入了解容器技术与产品最新趋势、容器AI工程化探索与实战以及企业大规模应用实践案例。阿里云容器服务技术专家带您解读容器服务ACK如何加速现代化应用平台构建。......
  • 独家好书丨《智算时代的容器技术演进与实践》免费下载
    2023云栖大会容器服务ACK分享实录合辑《智算时代的容器技术演进与实践》电子书正式上线!10+云栖精选议题带你深入了解容器技术与产品最新趋势、容器AI工程化探索与实战以及企业大规模应用实践案例。阿里云容器服务技术专家带您解读容器服务ACK如何加速现代化应用平台构建......
  • C++U4-第09课-STL容器
    学习目标 STL  栈stack [入栈出栈] 【算法分析】栈的基本操作。【参考代码】#include<bits/stdc++.h>usingnamespacestd;intmain(){stack<int>st;intn;cin>>n;for(inti=1;i<=n;i++){intx;cin......
  • IoC容器
    一、设计框架最基本功能:解析配置定位与注册对象注入对象提供通用工具类二、IoC容器的实现需要实现的点:创建注解提取标记对象实现容器依赖注入2、提取标记对象指定范围,获取范围内的所有类遍历所有类,获取被注解标记的类并加载进容器里**extractPacakgeClass......
  • Servlet容器中先执行Filter后执行Servlet是怎么实现的
     org.apache.catalina.core.ApplicationFilterChain#internalDoFilter filter.doFilter(request,response,this);this是ApplicationFilterChain  增加一个Filter,则Filters总数n增加1org.apache.catalina.core.ApplicationFilterChain#addFilter ......
  • docker容器自动重启命令
    在服务器意外断电或者重启的情况下,docker服务是关闭的一个状态,每次断电或者重启都要使用命令手动重启服务,但是每次都要手动命令重启,比较麻烦,因此根据要求设置docker服务自动重启。1、设置docker容器进行开机自动重启我们可以使用以下命令进行设置docker容器自动重启#docker服务设置......
  • 亚洲唯一,阿里云入选 Gartner® 容器管理领导者象限!
    日前,权威市场研究机构Gartner公布了最新的《2023年度容器管理魔力象限》(MagicQuadrant™forContainerManagement,September2023),为全球企业的容器产品选型提供专业指导。凭借国内第一的综合实力,阿里云首次进入该报告的领导者象限,也是亚洲地区唯一入选该象限的云服务......