高性能Go优化(上)——Go青训营笔记

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

一、性能优化

1. 概述

性能优化——提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力

优势:提升用户体验、资源高效利用,降低成本,提高效率。

2.性能优化层面

业务代码——SDK(软件开发工具包)——基础库——语言运行时——OS

业务层优化:

  • 针对特定场景,具体问题,具体分析
  • 容易获得较大性能收益

预约运行时优化:

  • 解决更通用的性能问题
  • Tradeoffs

数据驱动:

  • 自动化性能分析工具——pprof
  • 依靠数据而非猜测
  • 优化最大瓶颈优先

Go SDK至关重要

image-20220620093303812

性能优化注意事项:

  • 软件质量至关重要
  • 在保证接口稳定的前提下改进具体实现
  • 测试用例:覆盖尽可能多的场景,方便回归
  • 文档表示:做了什么,没做什么,达到效果等等
  • 隔离:通过选项控制是否开启优化
  • 可观测——即有必要的日志输出

1. 自动内存管理

相关名词概念

  • Auto memory management: 自动内存管理
  • Grabage collction(GC): 垃圾回收
  • Mutator:业务线程,分配新对象,修改对象指向关系。
  • Collector: GC 线程,找到存活对象,回收死亡对象的内存空间
  • Serial GC:只有一个collector
  • Parallel GC:并行GC,支持多个collectors同时回收的GC算法
  • Concurrent GC:并发 GC,mutators(s)和collector(s)可以同时进行。(不需要暂停,即STW(stop the word)模式)

image-20220621155112527

image-20220621155721056

(故Collectors必须感知对象指向关系的改变)

  • 评价GC算法相关名词:

    • 安全性(Safety):——基本要求:不能回收存活的对象
    • 吞吐率(Throughput):——花在GC上的时间:1-(GC时间/程序执行总时间)
    • 暂停时间(Pause time):——业务是否感知:STW
    • 内存开销(Space overhead):——GC元数据开销(越小越好)
  • 追踪垃圾回收(Tracing garbage collection)

    image-20220621163132096

    • 对象被回收的条件:指针指向关系不可达的对象

    • 标记根对象:——静态变量、全局变量、常量、线程栈等等

    • 标记:找到可达对象——求指针指向关系的传递闭包:从根对象出发,找到所有可达对象

    • 清理:所有不可达对象(根据对象的生命周期,使用不同的标记和清理策略)

      • 将存活对象复制到另外的内存空间(Copying GC)

        image-20220621163220670

      • 将死亡对象的内存标记为”可分配“(Mark-sweep GC)

        image-20220621163320630

      • 移动并整理存活对象(Mark-compact GC)

        image-20220621163417061

  • 分代GC(Generational GC)

    image-20220621210034731

    • Young generation: 年轻代
    • Old generation: 老年代

    image-20220621210237063

  • 引用计数

    • 每个对象都有一个与之关联的引用数目
    • 对象存活的条件:当且仅当引用数大于0

    image-20220621211151831

    图中圈内的数字即为引用计数,圆圈即为对象

    image-20220621211222391

总结:

image-20220621211403624

posted @ 2022-06-24 21:20  Luciferpluto  阅读(1)  评论(0)    收藏  举报  来源