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
|
|
|
|
|
|
|
predicts map[string]OptimizerJobExecutionTime
|
2020-04-30 05:08:08 +00:00
|
|
|
|
|
|
|
jobUtilsGPU map[string]int
|
|
|
|
versions map[string]int
|
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-12 17:30:25 +00:00
|
|
|
optimizerInstance.predicts = map[string]OptimizerJobExecutionTime{}
|
2020-04-30 05:08:08 +00:00
|
|
|
optimizerInstance.jobUtilsGPU = map[string]int{}
|
|
|
|
optimizerInstance.versions = map[string]int{}
|
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-30 05:08:08 +00:00
|
|
|
log.Info(optimizer.jobUtilsGPU)
|
|
|
|
log.Info(optimizer.predicts)
|
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 05:08:08 +00:00
|
|
|
last = t
|
2020-04-30 06:50:21 +00:00
|
|
|
version = optimizer.versions[jobName]
|
2020-04-30 05:08:08 +00:00
|
|
|
}
|
2020-04-30 06:50:21 +00:00
|
|
|
optimizer.jobUtilsGPU[jobName] = (version*last + sum/len(utils)) / (version + 1)
|
|
|
|
optimizer.versions[jobName]++
|
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++
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := optimizer.predicts[str[0]]; !ok {
|
|
|
|
optimizer.predicts[str[0]] = OptimizerJobExecutionTime{}
|
|
|
|
}
|
|
|
|
predict := optimizer.predicts[str[0]]
|
|
|
|
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-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 06:48:58 +00:00
|
|
|
log.Info("predictUtilGPU, ", job)
|
|
|
|
return 49, true
|
2020-04-30 05:08:08 +00:00
|
|
|
if _, err := optimizer.jobUtilsGPU[job]; err {
|
|
|
|
return 100, false
|
|
|
|
}
|
|
|
|
if optimizer.versions[job] > 5 {
|
|
|
|
return optimizer.jobUtilsGPU[job], true
|
|
|
|
}
|
|
|
|
return optimizer.jobUtilsGPU[job], false
|
|
|
|
}
|
|
|
|
|
2020-04-30 06:04:40 +00:00
|
|
|
func (optimizer *Optimizer) predictTime(job string) (OptimizerJobExecutionTime, bool) {
|
2020-04-30 06:48:58 +00:00
|
|
|
log.Info("predictTime,", job)
|
2020-04-30 05:08:08 +00:00
|
|
|
if _, err := optimizer.predicts[job]; err {
|
|
|
|
return OptimizerJobExecutionTime{}, false
|
|
|
|
}
|
|
|
|
return optimizer.predicts[job], optimizer.predicts[job].Version > 5
|
|
|
|
}
|