diff --git a/pkg/scheduler/internal/queue/scheduling_queue.go b/pkg/scheduler/internal/queue/scheduling_queue.go index 6788d04d282..4f584d69c66 100644 --- a/pkg/scheduler/internal/queue/scheduling_queue.go +++ b/pkg/scheduler/internal/queue/scheduling_queue.go @@ -1194,8 +1194,14 @@ func (p *PriorityQueue) movePodsToActiveOrBackoffQueue(logger klog.Logger, podIn activated := false for _, pInfo := range podInfoList { - // Since there may be many gated pods and they will not move from the - // unschedulable pool, we skip calling the expensive isPodWorthRequeueing. + // Scheduling-gated Pods never get schedulable with any events, + // except the Pods themselves got updated, which isn't handled by movePodsToActiveOrBackoffQueue. + // So, here we skip them early here so that they don't go through isPodWorthRequeuing, + // which isn't fast enough when the number of scheduling-gated Pods in unschedulablePods is large. + // + // Note that we cannot skip all pInfo.Gated Pods here + // because PreEnqueue plugins apart from the scheduling gate plugin may change the gating status + // with these events. if pInfo.Gated && pInfo.UnschedulablePlugins.Has(names.SchedulingGates) { continue }