性能调优实践|青训营

102 阅读2分钟

前一篇是提高cpu效率的方式,性能需要时间和空间效率上平衡。

  • 空结构体

1. 空结构体不占据任何的内存空间

2. 可作为各种场景下的占位符使用

3. 可以利用空结构体实现set,只需要用到map键,而不需要值

  • Atomic包

1. 实现多线程编程的一个计数器

2. 保证技术准确、性能安全的方式

3. 使用atomic包

(1) 锁的实现是通过操作系统来实现,属于系统调用

(2) Atomic操作是通过硬件实现,效率比锁高

(3) syn.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量

(4) 对于非数值操作,可以使用actomic.Value,能承载一个interface{}

  • 总结

1. 避免常见的性能缺陷可以保证大部分程序性能

2. 普通应用代码,不要一味地追求程序的性能

3. 越高级的性能优化手段越容易出现问题

4. 在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能

  •  性能调优工具
  • 性能调优原则
  1. 要依靠数据不是猜测

  2. 要定位最大瓶颈而不是细枝末节

  3. 不要过早优化

  4. 不要过度优化

  • 性能分析工具pprof

使用pprof可以知道应用在什么地方耗费了多少cpu、memory,它是用于可视化和分析性能分析数据的工具,它可以提供工具、采样、分析和展示的功能。

image.png

  • 排查实战

  • 搭建pprof实践项目

代码目录:

image.png

  • 浏览器查看指标

进程查看:

image.png

CPU:

命令:web

调用关系可视化 (导包未完成导致无法查看可视化,我再研究研究。。。)

  • pprof采样过程和原理
  1. 采样对象:函数调用和它们占用的时间
  2. 采样率:100次/秒,固定值
  3. 采样时间:从手动启动到手动结束 过程: 开始采样->设定信号处理函数->开启定时器 停止采样->取消信号处理函数->关闭定时器 CPU: 操作系统:每10ms向进程发送一次SIGPROF信号 进程:每次接收到SIGPROF会记录调用堆栈 写缓冲:每100ms读取已经记录的调用栈并写入输出流
  • Heap-堆内存

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

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

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

4. 采样指标: alloc space, alloc_objects, inuse_space, inuse_objects

5. 计算方式: inuse = alloc - free