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

81 阅读2分钟

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

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

高质量编程

高质量编程是一个比较主观的词,主要可以从三个方面来衡量:简单性、可读性、生产力。

以下是一些 go 语言编码规范:

  • 不需要注释实现接口的方法
  • 命名时缩略词全大写,比如 ServeHTTP
  • 函数名不包含包名的上下文信息,比如 http 包下创建服务的函数可以命名为 Serve,而不是 ServeHTTP,因为这样用户在使用时 http.ServeHTTP()
  • 尽量保证正常代码路径为最小缩进
  • 错误优先使用 errors.New() 来创建匿名变量来表示,如果有格式化要求,则使用 fmt.Errorf()
  • fmt.Errorf() 中使用关键字 %w 来将一个错误关联至错误链中
  • 除非在程序启动时发生不可逆转的错误时,可以使用 panic ,其他情况不建议使用 panic

以下是一些 go 语言性能优化的建议:

  • go 语言提供了 benchmark 工具来进行基准测试
image.png
  • silce,map 预分配内存
  • 一般使用 strings.Builder() 进行字符串处理
  • 使用空结构体节省内存,比如定义一个 Set,m := make(map[int]struct{},10)
  • 使用 atomic 包

性能调优实践

本部分主要介绍了一个性能分析工具 —— pprof

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

对于一个实际业务的优化可以分为以下方面:

  • 流程

    • 建立服务性能评估手段
    • 分析性能数据,定位性能瓶颈
    • 重点优化项改造
    • 优化效果验证
  • 建立压测评估链路

    • 服务性能评估
    • 构造请求流量
    • 压测范围
    • 性能数据采集
  • 分析性能火焰图,定位性能瓶颈

    • pprof 火焰图
  • 重点优化项分析

    • 规范组件库使用
    • 高并发场景优化
    • 增加代码检查规则避免增量劣化出现
    • 优化正确性验证
  • 上线验证评估

    • 逐步放量,避免出现问题
  • 进一步优化,服务整体链路分析

    • 规范上游服务调用接口,明确场景需求
    • 分析业务流程,通过业务流程优化提升服务性能

参考链接

pprof代码实验用例

Graphviz下载