mirror of https://github.com/k3s-io/k3s
Improve scheduler's performance by eliminating sorting when finding the host with the highest score
parent
5e9a5659b7
commit
ffc8cc2f50
|
@ -454,7 +454,7 @@ func TestGenericSchedulerWithExtenders(t *testing.T) {
|
||||||
// because of the errors from errorPredicateExtender and/or
|
// because of the errors from errorPredicateExtender and/or
|
||||||
// errorPrioritizerExtender.
|
// errorPrioritizerExtender.
|
||||||
predicates: map[string]algorithm.FitPredicate{"true": truePredicate},
|
predicates: map[string]algorithm.FitPredicate{"true": truePredicate},
|
||||||
prioritizers: []algorithm.PriorityConfig{{Map: EqualPriorityMap, Weight: 1}},
|
prioritizers: []algorithm.PriorityConfig{{Function: machine2Prioritizer, Weight: 1}},
|
||||||
extenders: []FakeExtender{
|
extenders: []FakeExtender{
|
||||||
{
|
{
|
||||||
predicates: []fitPredicate{errorPredicateExtender},
|
predicates: []fitPredicate{errorPredicateExtender},
|
||||||
|
|
|
@ -93,7 +93,6 @@ type genericScheduler struct {
|
||||||
predicateMetaProducer algorithm.PredicateMetadataProducer
|
predicateMetaProducer algorithm.PredicateMetadataProducer
|
||||||
prioritizers []algorithm.PriorityConfig
|
prioritizers []algorithm.PriorityConfig
|
||||||
extenders []algorithm.SchedulerExtender
|
extenders []algorithm.SchedulerExtender
|
||||||
lastNodeIndexLock sync.Mutex
|
|
||||||
lastNodeIndex uint64
|
lastNodeIndex uint64
|
||||||
alwaysCheckAllPredicates bool
|
alwaysCheckAllPredicates bool
|
||||||
cachedNodeInfoMap map[string]*schedulercache.NodeInfo
|
cachedNodeInfoMap map[string]*schedulercache.NodeInfo
|
||||||
|
@ -176,6 +175,22 @@ func (g *genericScheduler) Predicates() map[string]algorithm.FitPredicate {
|
||||||
return g.predicates
|
return g.predicates
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// findMaxScores returns the indexes of nodes in the "priorityList" that has the highest "Score".
|
||||||
|
func findMaxScores(priorityList schedulerapi.HostPriorityList) []int {
|
||||||
|
maxScoreIndexes := make([]int, 0, len(priorityList)/2)
|
||||||
|
maxScore := priorityList[0].Score
|
||||||
|
for i, hp := range priorityList {
|
||||||
|
if hp.Score > maxScore {
|
||||||
|
maxScore = hp.Score
|
||||||
|
maxScoreIndexes = maxScoreIndexes[:0]
|
||||||
|
maxScoreIndexes = append(maxScoreIndexes, i)
|
||||||
|
} else if hp.Score == maxScore {
|
||||||
|
maxScoreIndexes = append(maxScoreIndexes, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxScoreIndexes
|
||||||
|
}
|
||||||
|
|
||||||
// selectHost takes a prioritized list of nodes and then picks one
|
// selectHost takes a prioritized list of nodes and then picks one
|
||||||
// in a round-robin manner from the nodes that had the highest score.
|
// in a round-robin manner from the nodes that had the highest score.
|
||||||
func (g *genericScheduler) selectHost(priorityList schedulerapi.HostPriorityList) (string, error) {
|
func (g *genericScheduler) selectHost(priorityList schedulerapi.HostPriorityList) (string, error) {
|
||||||
|
@ -183,16 +198,11 @@ func (g *genericScheduler) selectHost(priorityList schedulerapi.HostPriorityList
|
||||||
return "", fmt.Errorf("empty priorityList")
|
return "", fmt.Errorf("empty priorityList")
|
||||||
}
|
}
|
||||||
|
|
||||||
sort.Sort(sort.Reverse(priorityList))
|
maxScores := findMaxScores(priorityList)
|
||||||
maxScore := priorityList[0].Score
|
ix := int(g.lastNodeIndex % uint64(len(maxScores)))
|
||||||
firstAfterMaxScore := sort.Search(len(priorityList), func(i int) bool { return priorityList[i].Score < maxScore })
|
|
||||||
|
|
||||||
g.lastNodeIndexLock.Lock()
|
|
||||||
ix := int(g.lastNodeIndex % uint64(firstAfterMaxScore))
|
|
||||||
g.lastNodeIndex++
|
g.lastNodeIndex++
|
||||||
g.lastNodeIndexLock.Unlock()
|
|
||||||
|
|
||||||
return priorityList[ix].Host, nil
|
return priorityList[maxScores[ix]].Host, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// preempt finds nodes with pods that can be preempted to make room for "pod" to
|
// preempt finds nodes with pods that can be preempted to make room for "pod" to
|
||||||
|
|
Loading…
Reference in New Issue