高性能Go语言内存优化与落地实践|青训营笔记

135 阅读2分钟

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

主要内容

本节课主要能学习到Go的内存优化方案介绍:

  • 内存管理优化

背景

  • 自动内存管理和内存管理机制

性能优化是为了什么呢

  • 提升软件系统处理能力,减少消耗,充分发挥计算机的算力
  • 用户体验
  • 资源高效利用

自动内存管理相关概念

  • Mutaor:业务流程
  • Collector:GC
  • Serical GC: only 一个collector
  • Parallel GC:支持多个collector同时回收
  • Concurrent GC:两个同时执行
  • Pause: stop the world 一张图说明问题

image.png

介绍两种GC算法

  • 追踪垃圾回收
  • 引用计数 衡量指标:安全性、吞吐率、stop the world time、内存开销

追踪垃圾回收

使用标记的方法(静态变量、全局变量、常量、线程栈等),标记找到可达的对象,清理所有不可达对象

清理的时候主要有三种方法:

  • 将存活对象复制到另外的内存空间 Copying GC(年轻代比较适合)
  • 将死亡对象的内存标记为可分配 Mark-sweep GC(老年代比较适合)
  • 移动并整理存活对象 Mark-compact GC

引用计数

被指向就计数+1,当等于0时就代表这个对象要被清理,但是如果时环的时候需要特殊考虑下,需要使用别的策略去回收

image.png

Go内存分配-分块

本质上讲就是提前在heap上分块,然后将差不多大小合适的块给到对象

image.png

Go内存分配-缓存

  • 每个p包含一个mcache用于快速分配,用于为绑定于p上的g分配对象
  • mcache管理一组mspan
  • 当mspan分配完毕,向mcentral申请带有未分配快的msapn
  • 当mspan没有分配的对象,并不会立即释放还给os,而是会缓存在mcentral中

image.png

  • G: 取 goroutine 的首字母,主要保存 goroutine 的一些状态信息以及 CPU 的一些寄存器的值
  • M: 取 machine 的首字母,它代表一个工作线程,或者说系统线程。G 需要调度到 M 上才能运行,M 是真正工作的人
  • P:取 processor 的首字母,为 M 的执行提供“上下文”,保存 M 执行 G 时的一些资源,例如本地可运行 G 队列,memeory cache 等。

字节的内存优化方案:Balanced GC

  • 每个g都绑定1块大小为1kb的内存,称作GAB
  • 满足两个条件,第一是noscan类型对象,第二<128B(这么定的原因是根据生产环境测试统计下来的)
  • 三个指针维护base(需要在h外部定义一个特殊的数据结构,来方便找到位置),end,top

image.png

缺点

带来的问题,内存会被延迟释放,所以使用copying GC的算法管理小对象

性能收益

image.png