Track resource usage across the cluster. Created utility in utilities/ to track the total and the unused resources for each host in the cluster. Added utility to def/taskUtils.go to retrieve the resource requirement for a given taskID. Decoupled the code, to launch a list of tasks on a set of offerIDs, to schedulers/helpers.go and updated all the scheduling policies to call this function instead of directly calling mesos.SchedulerDriver#LaunchTasks. The resource availability of the cluster is updated at 2 stages -- 1. When the tasks are about to be launched (in schedulers/helpers.go#LaunchTasks), the scheduling policy switching logic will be able to adhere to the update in the resource availability due to the JUST launched tasks and 2. when a terminal status update is received for a task (in schedulers/base.go#statusUpdate).
This commit is contained in:
parent
6cd61ed18b
commit
657dc8df93
9 changed files with 232 additions and 5 deletions
|
@ -36,6 +36,7 @@ func TasksFromJSON(uri string) ([]Task, error) {
|
|||
return nil, errors.Wrap(err, "Error unmarshalling")
|
||||
}
|
||||
|
||||
initTaskResourceRequirements(tasks)
|
||||
return tasks, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ import (
|
|||
"github.com/mash/gokmeans"
|
||||
"log"
|
||||
"sort"
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Information about a cluster of tasks.
|
||||
|
@ -122,3 +124,38 @@ func SortTasks(ts []Task, sb sortBy) {
|
|||
return sb(&ts[i]) <= sb(&ts[j])
|
||||
})
|
||||
}
|
||||
|
||||
// Map taskIDs to resource requirements.
|
||||
type TaskResources struct {
|
||||
CPU float64
|
||||
Ram float64
|
||||
Watts float64
|
||||
}
|
||||
|
||||
var taskResourceRequirement map[string]*TaskResources
|
||||
|
||||
// Record resource requirements for all the tasks.
|
||||
func initTaskResourceRequirements(tasks []Task) {
|
||||
taskResourceRequirement = make(map[string]*TaskResources)
|
||||
baseTaskID := "electron-"
|
||||
for _, task := range tasks {
|
||||
for i := *task.Instances; i > 0; i-- {
|
||||
taskID := fmt.Sprintf("%s-%d", baseTaskID + task.Name, *task.Instances)
|
||||
taskResourceRequirement[taskID] = &TaskResources{
|
||||
CPU: task.CPU,
|
||||
Ram: task.RAM,
|
||||
Watts: task.Watts,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Retrieve the resource requirement of a task specified by the TaskID
|
||||
func GetResourceRequirement(taskID string) (TaskResources, error) {
|
||||
if tr, ok := taskResourceRequirement[taskID]; ok {
|
||||
return *tr, nil
|
||||
} else {
|
||||
// Shouldn't be here.
|
||||
return TaskResources{}, errors.New("Invalid TaskID: " + taskID)
|
||||
}
|
||||
}
|
Reference in a new issue