1
0
mirror of https://github.com/newnius/YAO-scheduler.git synced 2025-06-07 22:31:55 +00:00
YAO-scheduler/src/optimizer.go

120 lines
2.8 KiB
Go
Raw Normal View History

2020-04-12 03:14:53 +00:00
package main
import (
log "github.com/sirupsen/logrus"
"sync"
2020-04-12 17:30:25 +00:00
"strings"
2020-04-12 03:14:53 +00:00
)
type Optimizer struct {
scheduler Scheduler
killedFlag bool
2020-04-12 17:30:25 +00:00
2020-04-30 07:50:05 +00:00
predicts map[string]*OptimizerJobExecutionTime
2020-04-30 05:08:08 +00:00
2020-04-30 08:45:43 +00:00
jobUtilsGPU map[string]*OptimizerUtilGPU
2020-04-12 03:14:53 +00:00
}
var optimizerInstance *Optimizer
var OptimizerInstanceLock sync.Mutex
func InstanceOfOptimizer() *Optimizer {
defer OptimizerInstanceLock.Unlock()
OptimizerInstanceLock.Lock()
if optimizerInstance == nil {
optimizerInstance = &Optimizer{}
2020-04-30 07:50:05 +00:00
optimizerInstance.predicts = map[string]*OptimizerJobExecutionTime{}
2020-04-30 08:45:43 +00:00
optimizerInstance.jobUtilsGPU = map[string]*OptimizerUtilGPU{}
2020-04-12 03:14:53 +00:00
}
return optimizerInstance
}
2020-04-12 17:30:25 +00:00
func (optimizer *Optimizer) feed(job string, utils []int) {
2020-04-12 03:14:53 +00:00
log.Info("optimizer feed")
log.Info(job, utils)
2020-04-12 17:30:25 +00:00
2020-04-30 05:13:38 +00:00
if len(utils) == 0 {
return
}
2020-04-12 17:30:25 +00:00
go func() {
str := strings.Split(job, "-")
if len(str) == 2 {
preCnt := 0
2020-04-30 06:50:21 +00:00
jobName := str[0]
2020-04-30 05:08:08 +00:00
sum := 0
for i := 0; i < len(utils); i++ {
sum += utils[i]
}
last := 0
2020-04-30 05:13:38 +00:00
version := 0
2020-04-30 06:50:21 +00:00
if t, err := optimizer.jobUtilsGPU[jobName]; !err {
2020-04-30 08:45:43 +00:00
last = t.Util
version = t.Version
2020-04-30 05:08:08 +00:00
}
2020-04-30 08:45:43 +00:00
optimizer.jobUtilsGPU[jobName].Util = (version*last + sum/len(utils)) / (version + 1)
optimizer.jobUtilsGPU[jobName].Version++
2020-04-30 05:08:08 +00:00
2020-04-12 17:30:25 +00:00
for i := 0; i < len(utils); i++ {
if utils[i] > 15 {
break
}
preCnt++
}
postCnt := 0
2020-04-30 05:08:08 +00:00
for i := len(utils) - 1; i >= 0; i-- {
2020-04-12 17:30:25 +00:00
if utils[i] > 15 {
break
}
postCnt++
}
2020-04-30 07:50:05 +00:00
if _, ok := optimizer.predicts[jobName]; !ok {
optimizer.predicts[jobName] = &OptimizerJobExecutionTime{}
2020-04-12 17:30:25 +00:00
}
2020-04-30 07:50:05 +00:00
predict := optimizer.predicts[jobName]
2020-04-12 17:30:25 +00:00
predict.Pre = ((predict.Pre * predict.Version) + preCnt) / (predict.Version + 1)
predict.Post = ((predict.Post * predict.Version) + postCnt) / (predict.Version + 1)
predict.Total = ((predict.Total * predict.Version) + len(utils)) / (predict.Version + 1)
2020-04-30 05:08:08 +00:00
predict.Main = predict.Total - predict.Pre - predict.Post
2020-04-30 08:45:43 +00:00
if predict.Main < 0 {
predict.Main = 0
}
2020-04-12 17:30:25 +00:00
predict.Version++
}
}()
2020-04-12 03:14:53 +00:00
}
2020-04-30 05:08:08 +00:00
2020-04-30 06:04:40 +00:00
func (optimizer *Optimizer) predictUtilGPU(job string) (int, bool) {
2020-04-30 07:11:06 +00:00
str := strings.Split(job, "-")
if len(str) == 2 {
jobName := str[0]
2020-04-30 08:45:43 +00:00
if _, ok := optimizer.jobUtilsGPU[jobName]; ok {
return optimizer.jobUtilsGPU[jobName].Util, optimizer.jobUtilsGPU[jobName].Version >= 5
2020-04-30 07:11:06 +00:00
}
2020-04-30 05:08:08 +00:00
}
2020-04-30 07:11:06 +00:00
return 100, false
2020-04-30 05:08:08 +00:00
}
2020-04-30 07:50:05 +00:00
func (optimizer *Optimizer) predictTime(job string) (*OptimizerJobExecutionTime, bool) {
2020-04-30 07:11:06 +00:00
str := strings.Split(job, "-")
if len(str) == 2 {
jobName := str[0]
if _, ok := optimizer.predicts[jobName]; ok {
2020-04-30 08:45:43 +00:00
return optimizer.predicts[job], optimizer.predicts[jobName].Version >= 5
2020-04-30 07:11:06 +00:00
}
2020-04-30 05:08:08 +00:00
}
2020-04-30 07:50:05 +00:00
return &OptimizerJobExecutionTime{}, false
2020-04-30 05:08:08 +00:00
}
2020-04-30 08:11:34 +00:00
func (optimizer *Optimizer) getAllPredicts() map[string]*OptimizerJobExecutionTime {
return optimizer.predicts
}
2020-04-30 08:45:43 +00:00
func (optimizer *Optimizer) getAllGPUUtils() map[string]*OptimizerUtilGPU {
2020-04-30 08:11:34 +00:00
return optimizer.jobUtilsGPU
}