性能瓶颈,最佳实践,经验总结

业务逻辑

  1. 出现无效甚至降低性能的逻辑。常见的有
    1. 逻辑重复:相同的操作在不同的位置做了多次或循环跳出的条件设置不当。
    2. 资源未复用:内存频繁申请和释放,数据库链接频繁建立和销毁等。
    3. 无效代码。

存储

  1. 未选择恰当的存储方式,常见的有:
    1. 临时数据存放到数据库中,导致频繁读写数据库。
    2. 将复杂的树状结构的数据用 SQL 数据库存储,出现大量冗余列,并且在读写时要进行拆解和拼接。
    3. 数据库表设计不当,无法有效利用索引查询,导致查询操作耗时高甚至出现大量慢查询。
    4. 热点数据未使用缓存,导致数据库负载过高,响应速度下降。

并发处理

  1. 并发操作的问题主要出现在资源竞争上,常见的有:
    1. 死锁/活锁导致大量阻塞,性能严重下降。
    2. 资源竞争激烈:大量的线程或协程抢夺一个锁。
    3. 临界区过大:将不必要的操作也放入临界区,导致锁的释放速度过慢,引起其他线程或协程阻塞。

在做内存问题相关的 profiling 时

  1. 若 gc 相关函数占用异常,可重点排查对象数量
  2. 解决速度问题(CPU占用)时,关注对象数量( --inuse/alloc_objects )指标
  3. 解决内存占用问题时,关注分配空间( --inuse/alloc_space )指标
  4. inuse 代表当前时刻的内存情况,alloc 代表从从程序启动到当前时刻累计的内存情况,一般情况下看 inuse 指标更重要一些,但某些时候两张图对比着看也能有些意外发现。

在日常 golang 编码时

  1. 参数类型要检查,尤其是 sql 参数要检查(低级错误)
  2. 传递struct尽量使用指针,减少复制和内存占用消耗(尤其对于赋值给interface,会分配到堆上,额外增加gc消耗)
  3. 尽量不使用循环引用,除非逻辑真的需要
  4. 能在初始化中做的事就不要放到每次调用的时候做

性能分析注意事项

  1. 性能分析必须在一个可重复的、稳定的环境中来进行。
    1. 不要在共享硬件上进行性能分析;
    2. 不要在性能分析期间,在同一个机器上去浏览网页
    3. 机器必须闲置
    4. 注意省电模式和过热保护,如果突然进入这些模式,会导致分析数据严重不准确
    5. 不要使用虚拟机、共享的云主机,太多干扰因素,分析数据会很不一致;
    6. (如果承受得起,购买专用的性能测试分析的硬件设备,上架)
    7. 关闭电源管理、过热管理;
    8. 绝不要升级,以保证测试的一致性,以及具有可比性。
    9. 如果没有这样的环境,那就一定要在多个环境中,执行多次,以取得可参考的、具有相对一致性的测试结果。

引用

  1. web应用性能优化经验总结
  2. 各种性能瓶颈汇总,持续更新
  3. Go语言 CPU 性能、内存分析调试方法大汇总
  4. 滴滴Go实战:高频服务接口超时排查&性能调优
  5. 鹅厂 Go 内存池/对象池技术实战爬坑指南
  6. 腾讯 Go 性能优化实战
  7. 滴滴实战分享:通过 profiling 定位 golang 性能问题 - 内存篇
posted @ 2020-07-21 10:57  白云辉  阅读(303)  评论(0)    收藏  举报