性能调优| 青训营笔记

70 阅读2分钟

介绍

性能调优原则:

  • 要依靠数据而不是猜测
  • 要定位最大瓶颈而不是细枝末节
  • 不要过早优化
  • 不要过度优化

性能分析工具pprof

功能

image.png

排查实战

采样过程和原理

CPU

采样对象:函数调用和它们占用的时间

采样率:100次/秒,固定值

采样时间:从手动启动到手动结束

CPU.png

操作系统:每10秒向进程发送一次SIGPROF信号

进程:每次接收到SIGPROF信号会调用堆栈

写缓存:每100秒读取已经记录的调用栈并写出输出流

image.png

Heap堆内存

采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量

采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录

采样时间:从程序运行开始到采样时

采样指标:alloc_space,alloc_objects,inuse_space,inuse_objects

计算方式:inuse=alloc-free

Goroutine协程&ThreadCreat线程创建

  • Goroutine

    记录所有用户发起且在运行中goroutine(即入口非runtime开头的)runtime.main栈调用信息

  • ThreadCreat

    记录程序创建的所有系统线程的信息

协程&线程创建.png

Block阻塞&Mutex锁

阻塞操作: 采样阻塞操作的次数和耗时

采样率:阻塞耗时超过阈值才会被记录,1为每次阻塞均记录

阻塞操作.png 锁竞争: 采样争夺锁的次数和耗时

采样率:只记录固定比例的锁操作,1为每次加锁均时间

锁竞争.png

性能调优案例

业务服务优化

.png 基本概念:

  • 服务
  • 依赖
  • 调用链路
  • 基础库

流程:

  1. 建立服务性能评估手段
  2. 分析性能数据,定位性能瓶颈
  3. 重点优化项改造
  4. 优化效果验证

手段:

  1. 服务性能评估方式

    单独benchmark无法满足复杂逻辑分析

    不同负载情况下性能表现差异

  2. 请求流量构造

    不同请求参数覆盖逻辑不同

    线上真实流量情况

  3. 压测范围

    单机器压测

    集群压测

  4. 性能数据采集

    单机性能数据

    集群性能数据

基础库优化

  • 分析核心逻辑和性能瓶颈
  • 内部压测验证
  • 推广业务服务落地验证

go语言优化

编译器和运行时优化:

  • 优化内存分配策略
  • 优化代码编译流程,生成更高效的程序
  • 内部压测验证
  • 推广业务服务落地验证

优点:

  • 接入简单
  • 通用性强