高性能Go语言发行版优化与落地实践 | 青训营笔记

68 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

今天这节课跟上节课差不多,讲述的都是如何优化系统,提升性能,更好的为用户服务

性能优化的层面

性能优化主要分为以下几个层次

  1. 业务代码 业务层是最顶层,也是最容易接触到的优化,对场景的针对性更强
  2. SDK
  3. 基础库
  4. 语言的Runtime 从语言的层次来优化运行过程 优化产生的效果更加的通用,会有一些权衡
  5. OS

性能的优化与软件质量 在保证接口稳定的情况下改进具体实现 测试用例:提升覆盖率 可观测性:可观测性这一点我之间一直不理解,一些消息服注册与发现,链路追踪的中间件经常会提到这个名词,在本节课中理解了,其实就是把整个的服务调用过程可视化的显示出来。

硬核的优化方式

  1. 自动内存管理
  • 动态内存管理来保证内存使用的正确性和安全性,有程序语言来管理,比如Java,Go
  • 重要的点就是GC的策略选取,第一种是启动一个线程,线性的收集垃圾内存。第二种是开启多个回收线程,可以并行的收集垃圾内存,但是这种策略相比于第一种减少了STW的时间。第三种就是垃圾回收线程与工作线程并行运行,但是垃圾回收线程需要感知对象指向关系的改变。 2.Go内存管理以及优化
  • 分块:提前将内存分块,根据对象的大小,选择最合适的返回,会有内碎片产生。
  • 缓存:在go的GMP模型中,每一个p包含一个mcache用来快速给p上绑定的g分配内存,每个mcache会管理一组的mspan。当mcache中的mspan分配完毕时,会向mcenter申请带有未分配块的mspan。当mspan中没有分配的对象,它会被缓存在mcenter中,而不是free给OS。这也是一种预取的策略
  • Balanced GC 将多个小对象的分配合并成一次大对象的分配。这种策略在别的地方也有体现,比如将多次随机写操作尽可能合并成一次顺序写。将多条向数据库中的插入batch成一次。 3.编译器和静态分析
  • 通过分析推导程序的行为,来分析出程序中的优化点。分为函数内部的过程内分析和函数间的过程间分析(比较复杂,需要根据上下文推导当前) 4.Go编译器优化
  • inline
  • 逃逸分析 内存应该分配在栈上还是在堆上