GO 高质量编程与性能调优实践 | 青训营笔记

56 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

一、本堂课重点内容

本堂课的知识点有哪些?

高性能Go语言发行版优化和落地实践

  • 优化

    • 内存管理优化
    • 编译器优化
  • 背景

    • 自动内存管理和Go内存管理机制
    • 编译器优化的基本问题和思路

二、详细知识点介绍

本堂课介绍了哪些知识点?

追求极致性能

  • 性能优化是什么?

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

    • 用户体验:带来用户体验的提升
    • 资源高效利用:降低成本,提高效率

性能优化的层面

  • 业务代码

    • 业务层优化

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

  • 基础库

  • 语言运行时

    • 语言运行时优化

    • 数据驱动

优化是什么?

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

二、为什么优化?

  1. 用户体验:带来用户体验的提升
  2. 资源高效利用:降低成本,提高效

三、优化点在哪?

  1. 业务层
    1. 针对特定场景,具体问题,具体分析
    2. 容易获得较大性能收益
  2. 内存管理
    1. GC垃圾回收优化
      1. 需要保证安全性和正确性的前提下才能优化

      2. 评价标注:安全性,吞吐率,暂停时间,内存开销

      3. 追踪垃圾回收

        1. 清理不可达对象,三种方式:

          1. 将存活对象复制到另外的内存空间 (Copying GC)
          2. 将死亡对象的内存标记为“可分配“ (Mark-sweep GC)
          3. 移动并整理存活对象 (Mark-compact GC)
        2. 分代假说

      4. 引用计数

        1. 清理引用数为0的对象
          1. 优点
            1. 内存管理的操作被平摊到程序执行过程中
            2. 内存管理不需要了解 runtime 的实现细节
          2. 缺点
            1. 维护引用计数的开销较大:通过原子操作保证对引用计数操作的原子性和可见性
            2. 无法回收环形数据结构
            3. 内存开销:每个对象都引入的额外内存空间存储引用数目
            4. 回收内存时依然可能引发暂停
    2. 内存分配优化
      1. 原生分配机制
      2. 问题分析
    3. 优化方案:Balanced GC

      1. 使用三个指针base, end, top 维护 GAB:
      2. GAB 对于 Go 内存管理来说是一个对象 • 本质:将多个小对象的分配合并成一次对象的分配 • 新的问题:GAB 的对象分配方式会导致内存被延迟释放 • 方案:用 copying GC 移动 GAB 中存活的对象
  • 本节课主要介绍了一个性能分析工具 —— pprof

主要可以分为:CPU、堆内存、协程、锁、阻塞、线程创建方面的优化,pprof提供了很方便的工具可以帮助我们定位错误。在线会生成 .dot 图像,可以下载 Graphviz 进行图像的查看。