大家好,我是编程小6,很高兴遇见你,有问题可以及时留言哦。
第三届字节跳动青训营讲师非常用心给大家整理了课前、中、后的学习内容,同学们自我评估,选择性查漏补缺,便于大家更好的跟上讲师们的节奏,祝大家学习愉快,多多提问交流~
本节课程主要分为四个方面:
课前部分主要罗列课程中涉及到的概念。对于不熟悉的概念,同学们可以提前查询预习;课中部分主要罗列每一部分的关键思路,帮助同学们跟上课程的进度;课后部分是一些问题,帮助同学们在课后梳理本课程的重点。
Tracing garbage collection: 追踪垃圾回收
Generational GC: 分代 GC
mmap()
系统调用什么是性能优化?
为什么要做性能优化?
性能优化
业务层优化
语言运行时优化
数据驱动
软件质量
保证接口稳定的前提下改进实现
测试驱动
通过清晰的文档告诉用户这一项优化做了什么,没做什么,能达到怎样的效果
隔离,优化代码用选项和原先的路径隔离,保证优化未启用时的行为同以前一致
可观测、可灰度、可回滚
三个任务
概念
Mutator: 业务线程,分配新对象,修改对象指向关系
Collector: GC 线程,找到存活对象,回收死亡对象的内存空间
Serial GC: 只有一个 collector
Parallel GC: 并行 GC,支持多个 collectors 同时回收的 GC 算法
Concurrent GC: 并发 GC,支持 mutator(s) 和 collector(s) 同时执行的 GC 算法
Collectors 必须感知对象指向关系的改变!
Tracing garbage collection: 追踪垃圾回收
被回收的条件:不可达对象
过程
标记根对象 (GC roots): 静态变量、全局变量、常量、线程栈等
标记:找到所有可达对象
清理:回收所有不可达对象占据的内存空间
优点
缺点
说明
提前将内存分块
内存缓存
mspan, mcache 和 mcentral 构成了内存管理的多级缓存机制。
可以看到,用于分配对象的函数 mallocgc()
占用 CPU 较高
横轴是对象大小,纵轴是数目,可以看到绝大多数对象都小于 80 B。因此优化小对象分配是关键。
if g.ab.end - g.ab.top < size {
// Allocate a new allocation buffer
}
addr := g.ab.top
g.ab.top += size
return addr
top
指针并返回,快速完成一次对象分配mallocgc()
进行对象分配的方式相比,balanced GC 缩短了对象分配的路径,减少了对象分配执行的指令数目,降低 CPU 使用从 Go runtime 内存管理模块的角度看,一个 allocation buffer 其实是一个大对象。本质上 balanced GC 是将多次小对象的分配合并成一次大对象的分配。因此,当 GAB 中哪怕只有一个小对象存活时,Go runtime 也会认为整个大对象(即 GAB)存活。为此,balanced GC 会根据 GC 策略,将 GAB 中存活的对象移动到另外的 GAB 中,从而压缩并清理 GAB 的内存空间,原先的 GAB 空间由于不再有存活对象,可以全部释放,如下图所示。
上图上方是两个 GAB,其中虚线表示 GAB 中对象的分界线。黑色表示 GAB 中存活的对象,白色表示死掉的对象。由于 GAB 中有存活对象,整个 GAB 无法被回收。
Balanced GC 会将 GAB 中存活的对象移动到下面的 GAB 中,这样原先的两个 GABs 就可以被释放,压缩并清理 GAB 的内存空间。
Balanced GC 只负责 noscan 对象的分配和移动,对象的标记和回收依然依赖 Go GC 本身,并和 Go GC 保持兼容。
上图的程序转换成控制流图 (control-flow graph)
通过分析控制流和数据流,我们可以知道更多关于程序的性质(properties) ,这些事实可以帮助我们做编译优化。
优点
缺点
采取一定的策略决定是否内联
Go 内联的限制
字节跳动的优化方案
开销
大致思路
从对象分配处出发,沿着控制流,观察数据流。若发现指针 p 在当前作用域 s:
则指针 p 逃逸出 s,反之则没有逃逸出 s.
优化:未逃逸出当前函数的指针指向的对象可以在栈上分配
是自动内存管理领域的集大成之作。把自动内存管理的问题、动机、方案、以及最新研究进展和方向进行了非常详尽的阐述。整个书很好读,参考文献非常充实,推荐大家阅读英文版。
是目前 HotSpot JVM 上 pauseless GC 实现的 proposal,可以看作 GC 领域比较新的工程方面的进展。
通过例子带大家理解互联网产品需要解决的问题以及方案。
在编译器前端着墨较多。本书第二版的第九章 机器无关优化,推荐大家反复仔细阅读。这一章主要讲述的是编译优化中常见的数据流分析问题,建议大家跟随书本仔细推导书中的例子,会帮助你对数据流分析有个大致的认识。这一章给出的引用文献大多是编译和静态分析领域非常有影响力的论文,有兴趣的同学可以阅读。
南京大学编译原理课程。
南京大学静态程序分析课程。参考文献 4 数据流分析读不懂的地方可以参考本课程的课件。
在编译器后端优化着墨较多。可以帮助大家理解后端优化的问题。
Goroutine allocation buffer (GAB) 的优化思路在 HotSopt JVM 也能找到类似的实现。
常量折叠数据流分析。
逃逸分析的 Java 实现。
本课程目标为带领同学们了解 Go 的 Database/SQL的实现,了解 GORM 的实现原理、使用简单,以及如何基于 GORM 做一些定制化开发。
课程结构为:
课前内容主要带领大家了解一些基础概念
知道什么是数据库、什么是 SQL
知道如何使用 database/sql 建立连接、使用
了解 DSN 是什么
对 GORM 有个简单的认知
课中课程的结构主要分为如下部分:
理解 Database/SQL
GORM 的使用简介
GORM 的设计原理
GORM 最佳实践
欢迎大家积极挑战,答案解析在本节课程直播完成后提供。
在大家已经学完前 5节 Go 原理与实践课程的基础上,通过项目实战帮助大家把前面学过的知识应用起来
通过阅读 www.cloudwego.io/zh/docs/kit… 尝试运行 Kitex 的示例代码
通过阅读 gorm.cn/docs/#Insta… 尝试运行 Gorm 的示例代码
了解 etcd 是什么以及 opentracing 是什么
EasyNote 提供了一套比较完整的笔记后端API服务.
项目地址 github.com/cloudwego/k…
推荐版本 Golang >= 1.15
框架文档地址 | github地址 | 拓展文档 | ||
---|---|---|---|---|
RPC框架Kitex | 框架文档 | www.cloudwego.io/zh/docs/kit… | github.com/cloudwego/k… | |
Kitex-etcd扩展 | github.com/kitex-contr… | github.com/kitex-contr… |
|
|
Kitex-OpenTracing扩展 | www.cloudwego.io/zh/docs/kit… | github.com/kitex-contr… |
|
|
ORM框架Gorm | 框架 | gorm.cn/zh_CN/ | github.com/go-gorm/gor… | |
Gorm-Opentracing扩展 | github.com/go-gorm/ope… | github.com/go-gorm/ope… |
|
|
HTTP框架Gin | 框架 | github.com/gin-gonic/g… | github.com/gin-gonic/g… | |
Gin-JWT扩展 | github.com/appleboy/gi… | github.com/appleboy/gi… |
idl | thrift / proto 接口定义文件 | 文档/子目录介绍 | |
---|---|---|---|
kitex_gen | Kitex自动生成的代码 | ||
pkg | constants | 常量 | |
errno | 错误码 | 关于错误码的讨论 | |
middleware | Kitex的中间件 | Kitex Middleware 扩展 | |
bound | Kitex Transport Pipeline-Bound 扩展 | 什么是Kitex的Transport Pipeline-Bound 扩展 | |
tracer | Jarger 初始化 | ||
cmd | api | demoapi服务的业务代码 |
|
note | demonote服务的业务代码 |
|
|
user | demouser服务的业务代码 |
docker-compose up
执行上述命令启动 MySQL、Etcd、Jaeger 的 docker 镜像
cd cmd/note
sh build.sh
sh output/bootstrap.sh
cd cmd/user
sh build.sh
sh output/bootstrap.sh
cd cmd/api
chmod +x run.sh
./run.sh