Skip to content

Commit 9a5f38f

Browse files
committed
Use FitsAnyNode in binpacking
This means that PreFilters are run once per pod in binpacking instead of #pods*#nodes times. This makes a huge performance difference in very large clusters.
1 parent 7c5524c commit 9a5f38f

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

cluster-autoscaler/estimator/binpacking_estimator.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (estimator *BinpackingNodeEstimator) Estimate(
6363
podInfos := calculatePodScore(pods, nodeTemplate)
6464
sort.Slice(podInfos, func(i, j int) bool { return podInfos[i].score > podInfos[j].score })
6565

66-
newNodeNames := make([]string, 0)
66+
newNodeNames := make(map[string]bool)
6767

6868
if err := estimator.clusterSnapshot.Fork(); err != nil {
6969
klog.Errorf("Error while calling ClusterSnapshot.Fork; %v", err)
@@ -80,16 +80,18 @@ func (estimator *BinpackingNodeEstimator) Estimate(
8080

8181
for _, podInfo := range podInfos {
8282
found := false
83-
for _, nodeName := range newNodeNames {
84-
if err := estimator.predicateChecker.CheckPredicates(estimator.clusterSnapshot, podInfo.pod, nodeName); err == nil {
85-
found = true
86-
if err := estimator.clusterSnapshot.AddPod(podInfo.pod, nodeName); err != nil {
87-
klog.Errorf("Error adding pod %v.%v to node %v in ClusterSnapshot; %v", podInfo.pod.Namespace, podInfo.pod.Name, nodeName, err)
88-
return 0
89-
}
90-
break
83+
84+
nodeName, err := estimator.predicateChecker.FitsAnyNodeMatching(estimator.clusterSnapshot, podInfo.pod, func(nodeInfo *schedulerframework.NodeInfo) bool {
85+
return newNodeNames[nodeInfo.Node().Name]
86+
})
87+
if err == nil {
88+
found = true
89+
if err := estimator.clusterSnapshot.AddPod(podInfo.pod, nodeName); err != nil {
90+
klog.Errorf("Error adding pod %v.%v to node %v in ClusterSnapshot; %v", podInfo.pod.Namespace, podInfo.pod.Name, nodeName, err)
91+
return 0
9192
}
9293
}
94+
9395
if !found {
9496
// Add new node
9597
newNodeName, err := estimator.addNewNodeToSnapshot(nodeTemplate, newNodeNameTimestamp, newNodeNameIndex)
@@ -103,7 +105,7 @@ func (estimator *BinpackingNodeEstimator) Estimate(
103105
klog.Errorf("Error adding pod %v.%v to node %v in ClusterSnapshot; %v", podInfo.pod.Namespace, podInfo.pod.Name, newNodeName, err)
104106
return 0
105107
}
106-
newNodeNames = append(newNodeNames, newNodeName)
108+
newNodeNames[newNodeName] = true
107109
}
108110
}
109111
return len(newNodeNames)

0 commit comments

Comments
 (0)