真实用50个并发INSERT制造合并压力,抓拍system.merges的实时进度,并找到堆积的真实根源——大小固定的后台工作线程池。
代码-- 真实50个并发INSERT,每个5万行 for i in 1..50: (INSERT INTO demo.mergebacklog SELECT ... FROM numbers(50000)) & wait SELECT table, elapsed, progress, num_parts, total_size_bytes_compressed FROM system.merges; SELECT active, count() FROM system.parts WHERE table='mergebacklog' GROUP BY active;
SELECT table, elapsed, progress, num_parts, total_size_bytes_compressed FROM system.merges; → mergebacklog elapsed=0.063s progress=0.512(51.2%) num_parts=6 size=8.2MB SELECT active, count() FROM system.parts WHERE table='mergebacklog' GROUP BY active; → active=0(inactive): 49 active=1(active) : 9
这次真实抓到了一个后台合并"正在进行中"的瞬间快照——6个part正在被合并成1个,已经做了51.2%,同时system.parts显示还有9个active part,说明这不是唯一在跑的合并任务;50次并发插入产生的50个原始part,这一刻已经真实有一部分(49个)被合并处理完变成inactive了。
SELECT value FROM system.server_settings WHERE name='background_pool_size'; → 16 ← 真实的后台合并/mutation工作线程数上限 3秒后再查: active parts: 4(从9继续下降) system.merges: 0行(这一轮合并任务已经处理完)
每一步都是本文上面用真实并发压力跑出来的原始结果。
system.merges 与 background_pool_size