置信: 0%
Cloudflare 三连补丁破解 ClickHouse 分区膨胀锁竞争瓶颈
内容摘要
Cloudflare 在计费管道中遭遇 ClickHouse 性能骤降,根源是分区键改为 (namespace, day) 后,数据部分数量激增导致全局互斥锁争用。他们通过共享锁、延迟复制向量和二分查找三个补丁,将查询延迟降低 50% 以上,并最终解耦了查询耗时与分区数量的关联。
核心要点
Cloudflare 使用 ClickHouse 存储超过 100PB 数据,其 Ready-Analytics 系统通过统一大表服务数百个内部团队。原始分区策略按 day 分区,但无法满足不同命名空间的保留策略。2025年1月,他们将分区键改为 (namespace, day),期望查询性能不受影响(因为查询按 namespace 过滤)。
然而,2025年3月计费聚合作业显著变慢。调查发现,尽管单查询读取的数据部分数未增加,但总部分数从数万增长至16万,导致 MergeTreeData 互斥锁 严重争用:每个查询计划线程需获取独占锁并复制整个部分列表。CPU 火焰图显示 45% 时间花在 filterPartsByPartition,而实时火焰图揭示超过一半的查询耗时在等待该互斥锁。
Cloudflare 依次部署三个补丁:1)将独占锁改为 std::shared_lock,允许并发读取,立刻消除锁争用;2)延迟复制部分列表,创建共享缓存,只复制过滤后的子集;3)利用部分列表按 namespace 排序的特性,实现 二分查找 跳过无关部分。最终查询耗时降低50%以上,并打破与部分数量的关联。这些补丁已合并到 ClickHouse 上游(PR #85535,版本 25.11)。
觉得这篇分析有用?
每周收到3-5条AI基础设施关键信号 →
💬 评论 (0)