From 359bcec0e097f448931fe1faadfec46322e8d94d Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Thu, 4 May 2023 16:55:32 -0700 Subject: [PATCH] benchmark test to evaluate the overhead of podMatchesScopeFunc --- pkg/quota/v1/evaluator/core/pods.go | 5 ++- pkg/quota/v1/evaluator/core/pods_test.go | 45 +++++++++++++++++++ .../pkg/quota/v1/generic/evaluator.go | 2 +- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/pkg/quota/v1/evaluator/core/pods.go b/pkg/quota/v1/evaluator/core/pods.go index b906df9325c..a201c58383e 100644 --- a/pkg/quota/v1/evaluator/core/pods.go +++ b/pkg/quota/v1/evaluator/core/pods.go @@ -328,8 +328,9 @@ func podMatchesScopeFunc(selector corev1.ScopedResourceSelectorRequirement, obje case corev1.ResourceQuotaScopeNotBestEffort: return !isBestEffort(pod), nil case corev1.ResourceQuotaScopePriorityClass: - if len(selector.Operator) == 0 && selector.Values == nil { - // this is just checking for existence of a priorityClass on the pod + if selector.Operator == corev1.ScopeSelectorOpExists { + // This is just checking for existence of a priorityClass on the pod, + // no need to take the overhead of selector parsing/evaluation. return len(pod.Spec.PriorityClassName) != 0, nil } return podMatchesSelector(pod, selector) diff --git a/pkg/quota/v1/evaluator/core/pods_test.go b/pkg/quota/v1/evaluator/core/pods_test.go index 59eea268f92..6068cff8c3f 100644 --- a/pkg/quota/v1/evaluator/core/pods_test.go +++ b/pkg/quota/v1/evaluator/core/pods_test.go @@ -1105,6 +1105,51 @@ func TestPodEvaluatorUsageResourceResize(t *testing.T) { } } +func BenchmarkPodMatchesScopeFunc(b *testing.B) { + pod, _ := toExternalPodOrError(makePod("p1", "high-priority", + api.ResourceList{api.ResourceCPU: resource.MustParse("1")}, api.PodRunning)) + + tests := []struct { + name string + selector corev1.ScopedResourceSelectorRequirement + }{ + { + name: "PriorityClass selector w/o operator", + selector: corev1.ScopedResourceSelectorRequirement{ + ScopeName: corev1.ResourceQuotaScopePriorityClass, + }, + }, + { + name: "PriorityClass selector w/ 'Exists' operator", + selector: corev1.ScopedResourceSelectorRequirement{ + ScopeName: corev1.ResourceQuotaScopePriorityClass, + Operator: corev1.ScopeSelectorOpExists, + }, + }, + { + name: "BestEfforts selector w/o operator", + selector: corev1.ScopedResourceSelectorRequirement{ + ScopeName: corev1.ResourceQuotaScopeBestEffort, + }, + }, + { + name: "BestEfforts selector w/ 'Exists' operator", + selector: corev1.ScopedResourceSelectorRequirement{ + ScopeName: corev1.ResourceQuotaScopeBestEffort, + Operator: corev1.ScopeSelectorOpExists, + }, + }, + } + + for _, tt := range tests { + b.Run(tt.name, func(b *testing.B) { + for n := 0; n < b.N; n++ { + _, _ = podMatchesScopeFunc(tt.selector, pod) + } + }) + } +} + func mockListerForResourceFunc(listerForResource map[schema.GroupVersionResource]cache.GenericLister) quota.ListerForResourceFunc { return func(gvr schema.GroupVersionResource) (cache.GenericLister, error) { lister, found := listerForResource[gvr] diff --git a/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator.go b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator.go index 55b31a745a0..e122248f861 100644 --- a/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator.go +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator.go @@ -199,7 +199,7 @@ func CalculateUsageStats(options quota.UsageStatsOptions, // need to verify that the item matches the set of scopes matchesScopes := true for _, scope := range options.Scopes { - innerMatch, err := scopeFunc(corev1.ScopedResourceSelectorRequirement{ScopeName: scope}, item) + innerMatch, err := scopeFunc(corev1.ScopedResourceSelectorRequirement{ScopeName: scope, Operator: corev1.ScopeSelectorOpExists}, item) if err != nil { return result, nil }