性能优化是一个老生常谈的问题了,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。而造成性能问题又有很多种,比如磁盘I/O、内存、网络、算法、大数据量等等。我们可以大致把性能问题分为四个层次:代码层次、数据库层次、算法层次、架构层次。
所以下面我会结合实际性能优化案例,和大家分享下性能调优的工具、方法和技巧。
说说心态
说到性能问题,你可能首先就想到的是麻烦或者头大,因为一般性能问题都比较紧急,轻则影响客户体验,重则宕机导致财务损失,而且性能问题比较隐蔽,不易发现。因此一时间无从下手,而这时我们就很容易从心底开始去排斥它,不愿接这烫手的山芋。
而恰巧,性能调优是体现程序员水平的一个重要指标。
因为处理bug、崩溃、调优、入侵等突发事件比编程本身更能体现平庸程序员与理想程序员的差距。当面对一个未知的问题时,如何定位复杂条件下的核心问题、如何抽丝剥茧地分析问题的潜在原因、如何排除干扰还原一个最小的可验证场景、如何抓住关键数据验证自己的猜测与实验,都是体现程序员思考力的最好场景。是的,在衡量理想程序员的标准上,思考力比经验更加重要。
所以,若你不甘平庸,请拥抱性能调优的每一个机会。当你拥有一个正确的心态,你所面对的性能问题就已经解决了一半。
说说技巧
拿到一个性能问题,不要忙着先上工具,先了解问题出现的背景,问题的严重程度。然后大致根据自己的经验积累作出预估。比如客户来了个性能问题说系统宕机了,已经造成资金损失了。这种涉及到钱的问题,大家都比较敏感,根据自己的level,决定是否要接这个锅。这不是逃避,而是自知之明。
了解问题背景之后,下一步就来尝试问题重现。如果在测试环境能够重现,那这种问题就很好跟踪分析。如果问题不能稳定重现或仅能在生产环境重现,那问题就相对比较棘手,这时要立刻收集现场证据,包括但不限于抓dump、收集应用程序以及系统日志、关注CPU内存情况、数据库备份等等,之后不妨再尝试重现,比如恢复客户数据库到测试环境重现。
不管问题能否重现,下一步,我们就要大致对问题进行分类,是代码层次的业务逻辑问题还是数据库层次的操作耗时问题,又或是系统架构的吞吐量问题。那如何确定呢?而我倾向于先从数据库动手。我的习惯做法是,使用数据库监控工具,先跟踪下Sql耗时情况。如果监控到耗时较长的SQL语句,那基本上就是数据库层次的问题,否则就是代码层次。若为代码层次,再研究完代码后,再细化为算法或架构层次问题。
精准定位问题点后,就是着手优化了。相信到这一步,就是优化策略的选择了,这里就不展开了。
优化后,最后当然要进行测试了,毕竟优化了多少,我们也要做到心里有谱才行。
总结
性能调优是一个循序渐进的过程,不可能一蹴而就,重在平时的点滴积累。
最后就大致总结下我的调优思路:
- 调整心态,积极应对
- 了解性能背景, 收集证据, 尝试重现
- 问题分类,先监控SQL耗时,大致确定是SQL或是代码层次原因
- 使用性能分析工具,确定问题点
- 调优测试
补充:
一般来说普通的业务系统性能问题一般都是数据库问题,减少连接查询,加索引,优化表结构,优化查询数据的字段一般都能解决
补充步骤:
1:先把问题进行定位,分析出是SQL引发的性能问题还是后端代码引发的性能问题!
2:根据具体问题进行“调优”,然后进行测试!
3:巧用工具以此提高开发效率!