Skip to content

Commit 008f056

Browse files
authored
Improve task scheduler rate limiter (#3860)
1 parent 3ade263 commit 008f056

15 files changed

+201
-117
lines changed

common/dynamicconfig/constants.go

+5
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,11 @@ const (
393393

394394
// TaskSchedulerEnableRateLimiter indicates if rate limiter should be enabled in task scheduler
395395
TaskSchedulerEnableRateLimiter = "history.taskSchedulerEnableRateLimiter"
396+
// TaskSchedulerEnableRateLimiterShadowMode indicates if task scheduler rate limiter should run in shadow mode
397+
// i.e. through rate limiter and emit metrics but do not actually block/throttle task scheduling
398+
TaskSchedulerEnableRateLimiterShadowMode = "history.taskSchedulerEnableRateLimiterShadowMode"
399+
// TaskSchedulerThrottleDuration is the throttle duration when task scheduled exceeds max qps
400+
TaskSchedulerThrottleDuration = "history.taskSchedulerThrottleDuration"
396401
// TaskSchedulerMaxQPS is the max qps task schedulers on a host can schedule tasks
397402
// If value less or equal to 0, will fall back to HistoryPersistenceMaxQPS
398403
TaskSchedulerMaxQPS = "history.taskSchedulerMaxQPS"

common/metrics/metric_defs.go

+1
Original file line numberDiff line numberDiff line change
@@ -1445,6 +1445,7 @@ var (
14451445
TaskBatchCompleteCounter = NewCounterDef("task_batch_complete_counter")
14461446
TaskReschedulerPendingTasks = NewDimensionlessHistogramDef("task_rescheduler_pending_tasks")
14471447
PendingTasksCounter = NewDimensionlessHistogramDef("pending_tasks")
1448+
TaskSchedulerThrottled = NewCounterDef("task_scheduler_throttled")
14481449
QueueScheduleLatency = NewTimerDef("queue_latency_schedule") // latency for scheduling 100 tasks in one task channel
14491450
QueueReaderCountHistogram = NewDimensionlessHistogramDef("queue_reader_count")
14501451
QueueSliceCountHistogram = NewDimensionlessHistogramDef("queue_slice_count")

common/tasks/benchmark_test.go

+15-8
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"go.temporal.io/server/common/clock"
3434
"go.temporal.io/server/common/dynamicconfig"
3535
"go.temporal.io/server/common/log"
36+
"go.temporal.io/server/common/metrics"
3637
"go.temporal.io/server/common/quotas"
3738
)
3839

@@ -62,15 +63,18 @@ func BenchmarkInterleavedWeightedRoundRobinScheduler_Sequential(b *testing.B) {
6263

6364
scheduler := NewInterleavedWeightedRoundRobinScheduler(
6465
InterleavedWeightedRoundRobinSchedulerOptions[*noopTask, int]{
65-
TaskChannelKeyFn: func(nt *noopTask) int { return rand.Intn(4) },
66-
ChannelWeightFn: func(key int) int { return channelKeyToWeight[key] },
67-
ChannelQuotaRequestFn: func(key int) quotas.Request { return quotas.NewRequest("", 1, "", "", "") },
68-
EnableRateLimiter: dynamicconfig.GetBoolPropertyFn(true),
66+
TaskChannelKeyFn: func(nt *noopTask) int { return rand.Intn(4) },
67+
ChannelWeightFn: func(key int) int { return channelKeyToWeight[key] },
68+
ChannelQuotaRequestFn: func(key int) quotas.Request { return quotas.NewRequest("", 1, "", "", "") },
69+
TaskChannelMetricTagsFn: func(key int) []metrics.Tag { return nil },
70+
EnableRateLimiter: dynamicconfig.GetBoolPropertyFn(true),
71+
EnableRateLimiterShadowMode: dynamicconfig.GetBoolPropertyFn(false),
6972
},
7073
Scheduler[*noopTask](&noopScheduler{}),
7174
quotas.NoopRequestRateLimiter,
7275
clock.NewRealTimeSource(),
7376
logger,
77+
metrics.NoopMetricsHandler,
7478
)
7579
scheduler.Start()
7680
defer scheduler.Stop()
@@ -92,15 +96,18 @@ func BenchmarkInterleavedWeightedRoundRobinScheduler_Parallel(b *testing.B) {
9296

9397
scheduler := NewInterleavedWeightedRoundRobinScheduler(
9498
InterleavedWeightedRoundRobinSchedulerOptions[*noopTask, int]{
95-
TaskChannelKeyFn: func(nt *noopTask) int { return rand.Intn(4) },
96-
ChannelWeightFn: func(key int) int { return channelKeyToWeight[key] },
97-
ChannelQuotaRequestFn: func(key int) quotas.Request { return quotas.NewRequest("", 1, "", "", "") },
98-
EnableRateLimiter: dynamicconfig.GetBoolPropertyFn(true),
99+
TaskChannelKeyFn: func(nt *noopTask) int { return rand.Intn(4) },
100+
ChannelWeightFn: func(key int) int { return channelKeyToWeight[key] },
101+
ChannelQuotaRequestFn: func(key int) quotas.Request { return quotas.NewRequest("", 1, "", "", "") },
102+
TaskChannelMetricTagsFn: func(key int) []metrics.Tag { return nil },
103+
EnableRateLimiter: dynamicconfig.GetBoolPropertyFn(true),
104+
EnableRateLimiterShadowMode: dynamicconfig.GetBoolPropertyFn(false),
99105
},
100106
Scheduler[*noopTask](&noopScheduler{}),
101107
quotas.NoopRequestRateLimiter,
102108
clock.NewRealTimeSource(),
103109
logger,
110+
metrics.NoopMetricsHandler,
104111
)
105112
scheduler.Start()
106113
defer scheduler.Stop()

0 commit comments

Comments
 (0)