From 26a45b2bd32c4c8c5cd2c3600bec6e4f30c6e3f3 Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Fri, 26 Jul 2019 00:30:31 -0700 Subject: [PATCH] EvenPodsSpread: Benchmarking Priority function --- .../priorities/even_pods_spread_test.go | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/pkg/scheduler/algorithm/priorities/even_pods_spread_test.go b/pkg/scheduler/algorithm/priorities/even_pods_spread_test.go index a9172c96b4c..3e859032597 100644 --- a/pkg/scheduler/algorithm/priorities/even_pods_spread_test.go +++ b/pkg/scheduler/algorithm/priorities/even_pods_spread_test.go @@ -17,6 +17,7 @@ limitations under the License. package priorities import ( + "fmt" "reflect" "testing" @@ -383,6 +384,92 @@ func TestCalculateEvenPodsSpreadPriority(t *testing.T) { } } +func makeNodesAndPods(pod *v1.Pod, existingPodsNum, allNodesNum, filteredNodesNum int) (existingPods []*v1.Pod, allNodes []*v1.Node, filteredNodes []*v1.Node) { + var topologyKeys []string + var labels []string + // regions := 3 + zones := 10 + for _, c := range pod.Spec.TopologySpreadConstraints { + topologyKeys = append(topologyKeys, c.TopologyKey) + labels = append(labels, c.LabelSelector.MatchExpressions[0].Key) + } + // build nodes + for i := 0; i < allNodesNum; i++ { + nodeWrapper := st.MakeNode().Name(fmt.Sprintf("node%d", i)) + for _, tpKey := range topologyKeys { + if tpKey == "zone" { + nodeWrapper = nodeWrapper.Label("zone", fmt.Sprintf("zone%d", i%zones)) + } else if tpKey == "node" { + nodeWrapper = nodeWrapper.Label("node", fmt.Sprintf("node%d", i)) + } + } + node := nodeWrapper.Obj() + allNodes = append(allNodes, node) + if len(filteredNodes) < filteredNodesNum { + filteredNodes = append(filteredNodes, node) + } + } + // build pods + for i := 0; i < existingPodsNum; i++ { + podWrapper := st.MakePod().Name(fmt.Sprintf("pod%d", i)).Node(fmt.Sprintf("node%d", i%allNodesNum)) + // apply labels[0], labels[0,1], ..., labels[all] to each pod in turn + for _, label := range labels[:i%len(labels)+1] { + podWrapper = podWrapper.Label(label, "") + } + existingPods = append(existingPods, podWrapper.Obj()) + } + return +} + +func BenchmarkTestCalculateEvenPodsSpreadPriority(b *testing.B) { + tests := []struct { + name string + pod *v1.Pod + existingPodsNum int + allNodesNum int + filteredNodesNum int + }{ + { + name: "1000nodes/single-constraint-zone", + pod: st.MakePod().Name("p").Label("foo", ""). + SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj()). + Obj(), + existingPodsNum: 10000, + allNodesNum: 1000, + filteredNodesNum: 500, + }, + { + name: "1000nodes/single-constraint-node", + pod: st.MakePod().Name("p").Label("foo", ""). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj()). + Obj(), + existingPodsNum: 10000, + allNodesNum: 1000, + filteredNodesNum: 500, + }, + { + name: "1000nodes/two-constraints-zone-node", + pod: st.MakePod().Name("p").Label("foo", "").Label("bar", ""). + SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj()). + SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("bar").Obj()). + Obj(), + existingPodsNum: 10000, + allNodesNum: 1000, + filteredNodesNum: 500, + }, + } + for _, tt := range tests { + b.Run(tt.name, func(b *testing.B) { + existingPods, allNodes, filteredNodes := makeNodesAndPods(tt.pod, tt.existingPodsNum, tt.allNodesNum, tt.filteredNodesNum) + nodeNameToInfo := schedulernodeinfo.CreateNodeNameToInfoMap(existingPods, allNodes) + b.ResetTimer() + for i := 0; i < b.N; i++ { + CalculateEvenPodsSpreadPriority(tt.pod, nodeNameToInfo, filteredNodes) + } + }) + } +} + var ( hardSpread = v1.DoNotSchedule softSpread = v1.ScheduleAnyway