138 lines
3.2 KiB
Go
138 lines
3.2 KiB
Go
package utils
|
|
|
|
// Author: Weisen Pan
|
|
// Date: 2023-10-24
|
|
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"sort"
|
|
"sync"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
v1 "k8s.io/api/core/v1"
|
|
|
|
"github.com/hkust-adsl/kubernetes-scheduler-simulator/knets_pkg/api/v1alpha1"
|
|
simontype "github.com/hkust-adsl/kubernetes-scheduler-simulator/knets_pkg/type"
|
|
gpushareutils "github.com/hkust-adsl/kubernetes-scheduler-simulator/knets_pkg/type/open-gpu-share/utils"
|
|
)
|
|
|
|
const (
|
|
Q1LackBoth = "q1_lack_both"
|
|
Q2LackGpu = "q2_lack_gpu"
|
|
Q3Satisfied = "q3_satisfied"
|
|
Q4LackCpu = "q4_lack_cpu"
|
|
XLSatisfied = "xl_satisfied"
|
|
XRLackCPU = "xr_lack_cpu"
|
|
NoAccess = "no_access"
|
|
)
|
|
|
|
var FragRatioDataMap = map[string]int{
|
|
Q1LackBoth: 0,
|
|
Q2LackGpu: 1,
|
|
Q3Satisfied: 2,
|
|
Q4LackCpu: 3,
|
|
XLSatisfied: 4,
|
|
XRLackCPU: 5,
|
|
NoAccess: 6,
|
|
}
|
|
|
|
var GpuNumTypeList = []string{"PureCpu", "ShareGpu", "OneGpu", "TwoGpu", "FourGpu", "EightGpu", "Others"}
|
|
|
|
type FragRatio struct {
|
|
Data []float64
|
|
}
|
|
|
|
type FragAmount struct {
|
|
NodeName string
|
|
Data []float64
|
|
}
|
|
|
|
func NewFragAmount(nodeName string, data []float64) FragAmount {
|
|
fragAmount := FragAmount{NodeName: nodeName, Data: make([]float64, len(data))}
|
|
copy(fragAmount.Data, data)
|
|
return fragAmount
|
|
}
|
|
|
|
func (fr FragRatio) AddRatio(fragType string, freq float64) error {
|
|
if freq < 0 || freq > 1 {
|
|
return fmt.Errorf("bad freq")
|
|
}
|
|
if index, ok := FragRatioDataMap[fragType]; !ok {
|
|
return fmt.Errorf("bad fragType")
|
|
} else {
|
|
fr.Data[index] += freq
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (fa FragAmount) AddGamma(faOther FragAmount, gamma float64) error {
|
|
if len(fa.Data) == 0 {
|
|
fa.Data = make([]float64, len(FragRatioDataMap))
|
|
for i := 0; i < len(FragRatioDataMap); i++ {
|
|
fa.Data[i] = 0
|
|
}
|
|
}
|
|
if len(fa.Data) != len(faOther.Data) {
|
|
return fmt.Errorf("this (%d) does not match the other (%d)", len(fa.Data), len(faOther.Data))
|
|
}
|
|
for i := 0; i < len(fa.Data); i++ {
|
|
fa.Data[i] += gamma * faOther.Data[i]
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (fa FragAmount) AddFragAmount(faOther FragAmount) error {
|
|
return fa.AddGamma(faOther, 1.0)
|
|
}
|
|
|
|
func (fa FragAmount) AddByFragType(fragType string, amount float64) error {
|
|
if amount < 0 {
|
|
return fmt.Errorf("bad freq")
|
|
}
|
|
if index, ok := FragRatioDataMap[fragType]; !ok {
|
|
return fmt.Errorf("bad fragType")
|
|
} else {
|
|
fa.Data[index] += amount
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (fr FragRatio) Repr() (outStr string) {
|
|
outStr += "["
|
|
for i, v := range fr.Data {
|
|
if i > 0 {
|
|
outStr += ", "
|
|
}
|
|
outStr += fmt.Sprintf("%4.1f%%", 100*v)
|
|
}
|
|
outStr += "]"
|
|
return outStr
|
|
}
|
|
|
|
func (fa FragAmount) Repr() (outStr string) {
|
|
outStr += fa.NodeName
|
|
outStr += ": ["
|
|
for i, v := range fa.Data {
|
|
if i > 0 {
|
|
outStr += ", "
|
|
}
|
|
outStr += fmt.Sprintf("%6.1f", v)
|
|
}
|
|
outStr += "]"
|
|
return outStr
|
|
}
|
|
|
|
func NodeGpuFragRatio(nodeRes simontype.NodeResource, typicalPods simontype.TargetPodList) FragRatio {
|
|
data := make([]float64, len(FragRatioDataMap))
|
|
fragRatio := FragRatio{data}
|
|
for _, pod := range typicalPods {
|
|
freq := pod.Percentage
|
|
if freq < 0 || freq > 1 {
|
|
log.Errorf("pod %v has bad freq: %f\n", pod.TargetPodResource, freq)
|
|
continue
|
|
}
|
|
fragType := GetNodePodFrag(nodeRes, pod.TargetPodResource)
|
|
log.Debugf("nodeRes: %s; pod: %s => fragType: %s (freq: %.2f)\n", nodeRes.Repr(), pod.TargetPodResource.Repr(), fragType,
|