字节跳动基于ClickHouse优化实践之“资源隔离”
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群
相信大家都对大名鼎鼎的 ClickHouse 有一定的了解了,它强大的数据分析性能让人印象深刻。但在字节大量生产使用中,发现了 ClickHouse 依然存在了一定的限制。例如:
缺少完整的 upsert 和 delete 操作
多表关联查询能力弱
集群规模较大时可用性下降(对字节尤其如此)
没有资源隔离能力
本篇将详细介绍我们是如何为 ClickHouse 增强资源隔离能力的。
广告业务遇到的资源管控问题
ClickHouse 的资源管控能力不够完善,在 insert、select 并发高的场景下会导致执行失败,影响用户体验。这是因为社区版 ClickHouse 目前仅提供依据不同用户的最大内存控制,在超过阈值时会杀死执行的 query。
在字节的广告业务中,需要区分不同查询的优先级;对查询性能抖动的容忍度较低;同时也需要支持 adhoc 能力;查询类型广泛、资源占用可能会较多。
ClickHouse 提供的粗粒度并发控制不能满足需求;
1. 无法灵活控制并发,导致查询迅速占满集群资源,部分后来的高优查询持续 pending,导致报错。
2. 无法给特定业务预留 cpu 资源,出现大查询占满 cpu,而后来的查询执行时间大幅增加。
ByteHouse 的解决方案:Resource Group
在这种情况下,字节在 ByteHouse(字节基于 ClickHouse 能力增强的版本)中开发了资源管理的组件:Resource Group。
基本思路是将并发、内存、CPU 等资源拆分给不同的资源组,同时通过资源组的父子关系实现不同资源组共享部分资源的能力。当用户的查询提交给引擎,依照定义的规则选定相应的资源组,然后评估该资源组以及父资源组是否能够执行该查询,如是则直接执行,否则进入该资源组的等待队列,等待资源释放。

并发控制
max_concurrent_queries 配置项控制一个资源组能够同时运行的查询上限。当资源组并发达到上限,或者该资源组的父资源组并发达到上限,引擎会把查询放入该资源组的等待队列。当该资源组有一个查询结束,引擎会执行该资源组等待队列中最早的查询;如果此时该资源组等待队列为空,则会触发父资源组的资源释放,进一步触发该父资源组的其他子资源组的等待队列查询执行,实现并发 quota 在一个父资源组之间的共享。
内存控制
每一个资源组可以配置一个软性的内存上限,当资源组中的查询使用内存超过这个软性限制之后,新查询将会进入等待队列。和并发控制类似,内存也会判断父资源组的限制,并使用类似的逻辑实现内存在一个父资源组之间的共享。
由于目前还没有一个准确的查询占用内存预估的模型,当前采取的策略是预估+实际内存矫正的模式,当一个新查询进入时,引擎会按照预估内存评估是否可以执行,在开始执行之后则是利用查询现有的 memory_tracker 在下一轮判断之前矫正预估值。
此软性的内存限制不同于原生 ClickHouse 的硬性内存限制,并不会杀死已经在执行的查询,而是用于控制新查询的可执行判断,因此可以配合使用。
CPU 控制
ByteHouse 使用 cgroups 提供的 cpu controller 实现资源组的 CPU 控制。Cpu controler 通过使用 CFS 调度器将 CPU 资源按照相同的时间分片进行分配,以实现不同 group 按照预定义的 cpu shares 占用相应的 CPU 资源。
在 ByteHouse 内部,我们实现了一个新的线程池类,在该类中给查询分配线程资源时,会依据当前 Context 中记录的资源组信息分配关联到相应 cgroup 的线程。
由于采用的 CFS 调度器,我们可以很容易的得到以下结论:
当所有资源组都有查询在执行时,每个资源组可以使用的 CPU 比例为
cpu_shares / sum(cpu_shares)当只有一个资源组有查询在执行时,该资源组可以使用的 CPU 比例为
100%
因此每个资源组可以使用的 CPU 资源比例范围就是 [cpu_shares/sum(cpu_shares), 100%],通过这个功能我们也就实现了两个预期效果:
保证了每个资源可以使用的 CPU 资源下限
保证了在任何 workload 情况下服务器 CPU 资源的总体利用率
Resource Group 带来的效果提升
Resource Group 能够显著的提升查询体验,为优先业务的查询提供保障,并且减小查询返回时间的方差。与此同时,也能够为集群稳定性带来提升,不会因为 OOM 杀死执行中的查询,以及防止一个服务出现故障而拖垮整个集群。
ByteHouse 的 Resource Group 主要有以下优点:
能够在 CPU、内存、并发控制等全方位的提供资源隔离的能力
可以限制低优先级查询带来的影响
降低写入语句可能带来的不良影响
在上文提到的广告业务中,使用 ByteHouse 替换 ClickHouse 后,查询时间明显缩短,体验明显改善。

应用前:

应用后:

可以看到上线前用户每天的查询平均耗时在 2.3s 到 14.1s 之间抖动,十分剧烈,用户的使用体验很差。上线后每天的查询平均耗时则在 0.4s 到 1.7s 之之间抖动,较好的保证了该优先业务的查询资源,并且显著缩短的平均查询返回时间。
ByteHouse 已经全面对外服务,并且提供各种版本以满足不同类型用户的需求。在 ByteHouse 官网上提交试用信息即可免费试用!欢迎大家试用。
点击跳转ByteHouse官方网站了解详情
字节跳动基于ClickHouse优化实践之“资源隔离”的更多相关文章
- 字节跳动基于ClickHouse优化实践之“多表关联查询”
更多技术交流.求职机会.试用福利,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻.但在字节大量 ...
- 字节跳动基于Apache Hudi构建EB级数据湖实践
来自字节跳动的管梓越同学一篇关于Apache Hudi在字节跳动推荐系统中EB级数据量实践的分享. 接下来将分为场景需求.设计选型.功能支持.性能调优.未来展望五部分介绍Hudi在字节跳动推荐系统中的 ...
- Docker实践(5)—资源隔离
Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...
- 字节跳动数据平台技术揭秘:基于 ClickHouse 的复杂查询实现与优化
更多技术交流.求职机会.试用福利,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 ClickHouse 作为目前业内主流的列式存储数据库(DBMS)之一,拥有着同类型 DBMS 难以企及 ...
- 字节跳动流式数据集成基于Flink Checkpoint两阶段提交的实践和优化
背景 字节跳动开发套件数据集成团队(DTS ,Data Transmission Service)在字节跳动内基于 Flink 实现了流批一体的数据集成服务.其中一个典型场景是 Kafka/ByteM ...
- 我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档
安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ...
- Presto 在字节跳动的内部实践与优化
在字节跳动内部,Presto 主要支撑了 Ad-hoc 查询.BI 可视化分析.近实时查询分析等场景,日查询量接近 100 万条.本文是字节跳动数据平台 Presto 团队-软件工程师常鹏飞在 Pre ...
- Go RPC 框架 KiteX 性能优化实践 原创 基础架构团队 字节跳动技术团队 2021-01-18
Go RPC 框架 KiteX 性能优化实践 原创 基础架构团队 字节跳动技术团队 2021-01-18
- 从 ClickHouse 到 ByteHouse:实时数据分析场景下的优化实践
本文来自火山引擎公众号,原文发布于2021-09-06. 近日,字节跳动旗下的企业级技术服务平台火山引擎正式对外发布「ByteHouse」,作为 ClickHouse 企业版,解决开源技术上手难 &a ...
- 深度介绍Flink在字节跳动数据流的实践
本文是字节跳动数据平台开发套件团队在1月9日Flink Forward Asia 2021: Flink Forward 峰会上的演讲分享,将着重分享Flink在字节跳动数据流的实践. 字节跳动数据流 ...
随机推荐
- Flask解决跨域问题
什么是跨域问题 跨域问题指的是浏览器限制了从一个源(协议.域名.端口)访问另一个源的资源的行为,这个限制是浏览器的一个安全机制.如果一个网页从一个源加载了另一种类型的资源(例如 HTML.CSS.脚本 ...
- java固定窗口大小
this.setResizable(false);//////frame.setResizable(false)
- 【开源】int,long long去一边去:高精度大合集!
加法 \(add\) string add(string s1, string s2) { //时间复杂度 O(log n) string res = ""; int c = 0, ...
- 深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析
本文分享自华为云社区<深入理解HarmonyOS UIAbility:生命周期.WindowStage与启动模式探析>,作者:柠檬味拥抱. UIAbility组件概述 UIAbility组 ...
- 【matlab混沌理论】1.1.混沌理论简介
混沌理论 1.简介 混沌理论是一个跨学科的科学研究领域和数学分支,专注于对初始条件高度敏感的动力系统的基本模式和确定性定律,曾被认为具有完全随机的无序和不规则状态.混沌理论指出,在混 ...
- Alpha-Beta剪枝的原理的深入理解(无图预警)
转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/17929261.html 考虑一个树: 一棵树上只有叶子节点有值,有确定的根节点的位置 根据层数来划分叶子节 ...
- ASR项目实战-决策点
针对语音识别的产品,分别记录设计.开发过程中的决策点. 实时语音识别 对于实时语音识别来说,客户端和服务端之间实时交换语音数据和识别的结果. 客户端在启动识别时,即开始发送语音数据,期望在等待较短的时 ...
- Windows Server 2019/2016 配置自动更新和更换大陆更新服务器
文章原地址: 运行 > gpedit.msc -> 计算机配置 -> 管理模板 -> Windows 组件 -> Windows 更新 下面中右侧三个选项是本篇教程中会介 ...
- Map的特性(有序和无序)讨论
目录 什么是红黑树? 在 Java 中,基础java.util.Map 接口本身并不保证元素的顺序.具体的实现类 HashMap 和 TreeMap 的行为(无序.有序)有所不同: HashMap 类 ...
- 放弃JavaFx开发学习
放弃JavaFx开发学习 一开始学学习JavaFx是想用java写个小游戏,后来学者JavaFx越来越深,发现坑也越来越多,不禁感叹:JavaFx果然是要抛弃的UI玩儿,UI开发还是用react na ...