-
Notifications
You must be signed in to change notification settings - Fork 6k
Labels
affects-6.5This bug affects the 6.5.x(LTS) versions.This bug affects the 6.5.x(LTS) versions.affects-7.1This bug affects the 7.1.x(LTS) versions.This bug affects the 7.1.x(LTS) versions.affects-7.5This bug affects the 7.5.x(LTS) versions.This bug affects the 7.5.x(LTS) versions.affects-8.1This bug affects the 8.1.x(LTS) versions.This bug affects the 8.1.x(LTS) versions.report/customerCustomers have encountered this bug.Customers have encountered this bug.severity/majorsig/sql-infraSIG: SQL InfraSIG: SQL Infratype/bugThe issue is confirmed as a bug.The issue is confirmed as a bug.type/regression
Description
Bug Report
Please answer these questions before submitting your issue. Thanks!
1. Minimal reproduce step (Required)
tidb/pkg/store/copr/coprocessor.go
Lines 222 to 256 in 0abf3ae
if it.req.KeepOrder { | |
// Don't set high concurrency for the keep order case. It wastes a lot of memory and gains nothing. | |
// TL;DR | |
// Because for a keep order coprocessor request, the cop tasks are handled one by one, if we set a | |
// higher concurrency, the data is just cached and not consumed for a while, this increase the memory usage. | |
// Set concurrency to 2 can reduce the memory usage and I've tested that it does not necessarily | |
// decrease the performance. | |
// For ReqTypeAnalyze, we keep its concurrency to avoid slow analyze(see https://github.com/pingcap/tidb/issues/40162 for details). | |
if it.concurrency > 2 && it.req.Tp != kv.ReqTypeAnalyze { | |
oldConcurrency := it.concurrency | |
partitionNum := req.KeyRanges.PartitionNum() | |
if partitionNum > it.concurrency { | |
partitionNum = it.concurrency | |
} | |
it.concurrency = 2 | |
if it.concurrency < partitionNum { | |
it.concurrency = partitionNum | |
} | |
failpoint.Inject("testRateLimitActionMockConsumeAndAssert", func(val failpoint.Value) { | |
if val.(bool) { | |
// When the concurrency is too small, test case tests/realtikvtest/sessiontest.TestCoprocessorOOMAction can't trigger OOM condition | |
it.concurrency = oldConcurrency | |
} | |
}) | |
} | |
if it.smallTaskConcurrency > 20 { | |
it.smallTaskConcurrency = 20 | |
} | |
it.sendRate = util.NewRateLimit(2 * (it.concurrency + it.smallTaskConcurrency)) | |
it.respChan = nil | |
} else { | |
it.respChan = make(chan *copResponse) | |
it.sendRate = util.NewRateLimit(it.concurrency + it.smallTaskConcurrency) | |
} |
This code is intended to make memory usage more efficient. The basic idea is when keep order is true, there is no need to start too many cop workers to receive data, because we want the data to return by order.
However, if selection pushdown occurs, it may require reading many rows to get the desired data. In that case, keeping the concurrency level too low can significantly slow down performance.
2. What did you expect to see? (Required)
3. What did you see instead (Required)
4. What is your TiDB version? (Required)
master
Metadata
Metadata
Assignees
Labels
affects-6.5This bug affects the 6.5.x(LTS) versions.This bug affects the 6.5.x(LTS) versions.affects-7.1This bug affects the 7.1.x(LTS) versions.This bug affects the 7.1.x(LTS) versions.affects-7.5This bug affects the 7.5.x(LTS) versions.This bug affects the 7.5.x(LTS) versions.affects-8.1This bug affects the 8.1.x(LTS) versions.This bug affects the 8.1.x(LTS) versions.report/customerCustomers have encountered this bug.Customers have encountered this bug.severity/majorsig/sql-infraSIG: SQL InfraSIG: SQL Infratype/bugThe issue is confirmed as a bug.The issue is confirmed as a bug.type/regression