性能瓶颈,最佳实践,经验总结
业务逻辑
- 出现无效甚至降低性能的逻辑。常见的有
- 逻辑重复:相同的操作在不同的位置做了多次或循环跳出的条件设置不当。
- 资源未复用:内存频繁申请和释放,数据库链接频繁建立和销毁等。
- 无效代码。
存储
- 未选择恰当的存储方式,常见的有:
- 临时数据存放到数据库中,导致频繁读写数据库。
- 将复杂的树状结构的数据用 SQL 数据库存储,出现大量冗余列,并且在读写时要进行拆解和拼接。
- 数据库表设计不当,无法有效利用索引查询,导致查询操作耗时高甚至出现大量慢查询。
- 热点数据未使用缓存,导致数据库负载过高,响应速度下降。
并发处理
- 并发操作的问题主要出现在资源竞争上,常见的有:
- 死锁/活锁导致大量阻塞,性能严重下降。
- 资源竞争激烈:大量的线程或协程抢夺一个锁。
- 临界区过大:将不必要的操作也放入临界区,导致锁的释放速度过慢,引起其他线程或协程阻塞。
在做内存问题相关的 profiling 时
- 若 gc 相关函数占用异常,可重点排查对象数量
- 解决速度问题(CPU占用)时,关注对象数量( --inuse/alloc_objects )指标
- 解决内存占用问题时,关注分配空间( --inuse/alloc_space )指标
- inuse 代表当前时刻的内存情况,alloc 代表从从程序启动到当前时刻累计的内存情况,一般情况下看 inuse 指标更重要一些,但某些时候两张图对比着看也能有些意外发现。
在日常 golang 编码时
- 参数类型要检查,尤其是 sql 参数要检查(低级错误)
- 传递struct尽量使用指针,减少复制和内存占用消耗(尤其对于赋值给interface,会分配到堆上,额外增加gc消耗)
- 尽量不使用循环引用,除非逻辑真的需要
- 能在初始化中做的事就不要放到每次调用的时候做
性能分析注意事项
- 性能分析必须在一个可重复的、稳定的环境中来进行。
- 不要在共享硬件上进行性能分析;
- 不要在性能分析期间,在同一个机器上去浏览网页
- 机器必须闲置
- 注意省电模式和过热保护,如果突然进入这些模式,会导致分析数据严重不准确
- 不要使用虚拟机、共享的云主机,太多干扰因素,分析数据会很不一致;
- (如果承受得起,购买专用的性能测试分析的硬件设备,上架)
- 关闭电源管理、过热管理;
- 绝不要升级,以保证测试的一致性,以及具有可比性。
- 如果没有这样的环境,那就一定要在多个环境中,执行多次,以取得可参考的、具有相对一致性的测试结果。
引用
作者:百里求一
出处:http://www.cnblogs.com/bergus/
我的语雀: https://www.yuque.com/barry.bai
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号