ROG技术剖析与业务落地

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. ROG 技术剖析与业务落地 演讲人:陈卓钰 SPEAKER: CHEN ZHUOYU
2. 目录 |Contents Part 01 项目简介Part 02 同类现状Part 03 实现细节Part 04 性能数据 ROG 的项目背景以及设 计目标和边界Go 编译器的现状以及高 性能 Go 所面临的挑战内存分配器以及 GC 的设 计思路与实现综合压测数据以及线上 服务收益
3. 01 项目简介 ROG 的项目背景、功能特性,以及设计目标和边界
4. ROG 是什么
5. ROG 是什么 • 一个用 Rust 从头实现的 Go 编译器
6. ROG 是什么 •一个用 Rust 从头实现的 Go 编译器 •Refinement of Go / Reimplementation of Go / Rust on Go
7. ROG 是什么 •一个用 Rust 从头实现的 Go 编译器 •Refinement of Go / Reimplementation of Go / Rust on Go •编译器前端从 rustc 改造而来,支持更多高级特性
8. ROG 是什么 •一个用 Rust 从头实现的 Go 编译器 •Refinement of Go / Reimplementation of Go / Rust on Go •编译器前端从 rustc 改造而来,支持更多高级特性 •后端基于 LLVM,是高性能的保障
9. ROG 是什么 •一个用 Rust 从头实现的 Go 编译器 •Refinement of Go / Reimplementation of Go / Rust on Go •编译器前端从 rustc 改造而来,支持更多高级特性 •后端基于 LLVM,是高性能的保障 •Runtime 由 Rust 写成,使用顶会论文算法、无锁结构等
10. ROG 的背景
11. ROG 的背景 • 降本增效,而不增笑
12. ROG 的背景 •降本增效,而不增笑 •字节拥有海量使用 Go 进行开发的业务
13. ROG 的背景 •降本增效,而不增笑 •字节拥有海量使用 Go 进行开发的业务 •Go 的性能对于我们来说已经有点掣肘了:一味追求编译速度,放弃了大量的优化,从而牺牲了运行时性能
14. ROG 的背景 •降本增效,而不增笑 •字节拥有海量使用 Go 进行开发的业务 •Go 的性能对于我们来说已经有点掣肘了:一味追求编译速度,放弃了大量的优化,从而牺牲了运行时性能 •LLVM 是业界使用最广泛的编译器后端,能提供我们需要的各种能力
15. ROG 的背景 • 原版 Go 编译器缺少许多优化 —— 我们以下列 MaxArray 函数为例
16. ROG 的背景 • 原版 Go 编译器缺少许多优化 —— 我们以下列 MaxArray 函数为例
17. ROG 的目标与非目标
18. 目标 非目标 ✓ 语言特性与 Go 100% 兼容⚫ 自举 ✓ 高性能 runtime⚫ 编译速度快 ✓ 支持 LLVM 高级特性⚫ Plan9 汇编 ✓ LTO ✓ PGO ✓ BOLT ✓ 可扩展 ⚫ linkname 内部符号
19. 02 同类现状 Go 编译器的现状、高性能 Go 所面临的挑战以及解决思路
20. Go 编译器的现状
21. Go 编译器的现状 • 市面上有许多第三方的 Go 编译器,但都存在各自的问题
22. Go 编译器的现状 •市面上有许多第三方的 Go 编译器,但都存在各自的问题 •gccgo: 采用 GCC 作为后端,版本老旧,维护不积极,性能差
23. Go 编译器的现状 •市面上有许多第三方的 Go 编译器,但都存在各自的问题 •gccgo: 采用 GCC 作为后端,版本老旧,维护不积极,性能差 •gollvm: 后端由 C++写成,前端是 gccgo 移植而来,特性支持不完整,开发不积极
24. Go 编译器的现状 •市面上有许多第三方的 Go 编译器,但都存在各自的问题 •gccgo: 采用 GCC 作为后端,版本老旧,维护不积极,性能差 •gollvm: 后端由 C++写成,前端是 gccgo 移植而来,特性支持不完整,开发不积极 •TinyGo: 面向嵌入式,许多特性不支持
25. Go 编译器的现状 •市面上有许多第三方的 Go 编译器,但都存在各自的问题 •gccgo: 采用 GCC 作为后端,版本老旧,维护不积极,性能差 •gollvm: 后端由 C++写成,前端是 gccgo 移植而来,特性支持不完整,开发不积极 •TinyGo: 面向嵌入式,许多特性不支持 •llgo: 只是采用了 Go 的语法的一种胶水语言
26. 高性能 Go 所面临的挑战
27. 高性能 Go 所面临的挑战 其本质都是 LLVM 与 Go 的适配问题
28. 高性能 Go 所面临的挑战 • GC Write Barrier
29. 高性能 Go 所面临的挑战 • GC Write Barrier • 假设 p 和 q 都是指针,那么对于 *p = q 这样的语句是需要插入 GC 写屏障的
30. 高性能 Go 所面临的挑战 • GC Write Barrier •假设 p 和 q 都是指针,那么对于 *p = q 这样的语句是需要插入 GC 写屏障的 •需要在 LLVM 里增加相关的 pass 来处理写屏障
31. 高性能 Go 所面临的挑战 •GC Write Barrier •栈空间的动态管理
32. 高性能 Go 所面临的挑战 •GC Write Barrier •栈空间的动态管理 • 函数栈空间不足时需要扩栈,而栈空间富裕时可以回收多余的空间
33. 高性能 Go 所面临的挑战 •GC Write Barrier •栈空间的动态管理 •函数栈空间不足时需要扩栈,而栈空间富裕时可以回收多余的空间 •通过 LLVM 里的 pass 插入 stack check prologue 来实现
34. 高性能 Go 所面临的挑战 •GC Write Barrier •栈空间的动态管理 •抢占式调度
35. 高性能 Go 所面临的挑战 •GC Write Barrier •栈空间的动态管理 •抢占式调度 • 为了避免长时间运行的任务阻塞调度器,通过 LLVM 插入 checkpoint 来实现
36. 03 实现细节 两个关键组件:内存分配器以及 GC 的设计思路与实现
37. 内存分配器
38. 内存分配器 • 市面上有不少开源的分配器,但是都不满足需求
39. 内存分配器 •市面上有不少开源的分配器,但是都不满足需求 •jemalloc: 难以绑定元数据,难以索引对象,难以指定地址范围,不能批量释放,近期停止维护
40. 内存分配器 •市面上有不少开源的分配器,但是都不满足需求 •jemalloc: 难以绑定元数据,难以索引对象,难以指定地址范围,不能批量释放,近期停止维护 •tcmalloc / mimalloc: 无法绑定元数据,不能批量释放
41. 内存分配器 •市面上有不少开源的分配器,但是都不满足需求 •jemalloc: 难以绑定元数据,难以索引对象,难以指定地址范围,不能批量释放,近期停止维护 •tcmalloc / mimalloc: 无法绑定元数据,不能批量释放 •bdw-gc: 多线程性能差,协程支持困难,仅支持 STW GC
42. 内存分配器 •市面上有不少开源的分配器,但是都不满足需求 •jemalloc: 难以绑定元数据,难以索引对象,难以指定地址范围,不能批量释放,近期停止维护 •tcmalloc / mimalloc: 无法绑定元数据,不能批量释放 •bdw-gc: 多线程性能差,协程支持困难,仅支持 STW GC 所以 ROG 需要设计自己的内存分配器
43. 内存分配器 • 采用分级内存管理,高性能
44. 内存分配器 •采用分级内存管理,高性能 •最大支持 1TB 堆大小
45. 内存分配器 •采用分级内存管理,高性能 •最大支持 1TB 堆大小 •支持运行时对象索引
46. 内存分配器 •采用分级内存管理,高性能 •最大支持 1TB 堆大小 •支持运行时对象索引 •支持批量释放(配合 GC)
47. 内存分配器 •采用分级内存管理,高性能 •最大支持 1TB 堆大小 •支持运行时对象索引 •支持批量释放(配合 GC) •优秀的缓存局部性
48.
49. 垃圾回收器(GC)
50. 垃圾回收器(GC) • 支持多种 GC 触发策略
51. 垃圾回收器(GC) •支持多种 GC 触发策略 •支持多种 GC 算法(STW GC,三色 GC),目前默认为 STW GC
52. 垃圾回收器(GC) •支持多种 GC 触发策略 •支持多种 GC 算法(STW GC,三色 GC),目前默认为 STW GC 标记准备 并发标记 •暂停所有的 P 和 G(Stop the world) •标记所有的 GC Roots(全局变量、栈) 终止标记 并发清理
53. 垃圾回收器(GC) •支持多种 GC 触发策略 •支持多种 GC 算法(STW GC,三色 GC),目前默认为 STW GC 标记准备 并发标记 终止标记 •从 GC Roots 开始多线程并发标记存活对象 •将当前对象引用的、未标记的对象加入队列 •直到所有对象都被标记 并发清理
54. 垃圾回收器(GC) •支持多种 GC 触发策略 •支持多种 GC 算法(STW GC,三色 GC),目前默认为 STW GC 标记准备 并发标记 终止标记 •处理析构函数(Finalizer) •递归标记析构函数所关联的对象 •复活关联的对象,摘除并入队相应的析构函数 并发清理
55. 垃圾回收器(GC) •支持多种 GC 触发策略 •支持多种 GC 算法(STW GC,三色 GC),目前默认为 STW GC 标记准备 并发标记 •清理未标记的对象 •重启世界(Start the World) •调用析构函数 终止标记 并发清理
56. 04 性能数据 综合压测数据以及业务落地之后产生的实际收益展示
57. 多线程计算 π
58. Kitex Benchmark ROG_OPTS=@./config.toml taskset -c 0-3 ./kitex-benchmark-server GOMAXPROCS=4 taskset -c 0-3 ./kitex-benchmark-server-go
59. 线上服务 A 平均 %CPU: 54.5% -> 45%
60. 线上服务 B 平均 %CPU: ~36% -> ~22%
61. 问答时间
62. THANKS

Главная - Вики-сайт
Copyright © 2011-2026 iteam. Current version is 2.148.3. UTC+08:00, 2026-01-07 05:34
浙ICP备14020137号-1 $Гость$