性能优化流程可以划分为需求调研、准入、调优实施、准出、知识库沉淀这5个阶段。不同企业的组织架构和人员能力会有所区别,具体进行调优的人员可能是性能测试人员,可能是开发人员,可能是架构师,也可能是专职的性能调优人员。
性能调优和性能测试一样,首先都要进行需求调研工作。需要先了解清楚待调优系统的优化目标、业务流程、系统架构信息和资源配置信息。
优化目标又可以细分为业务目标和资源目标。业务目标又分为响应时间(交易平均响应时间、99%交易响应时间等)、TPS、成功率等指标。资源目标可以细分为CPU利用率、内存占用率、磁盘10使用率、网络带宽使用率等指标。性能优化是近乎于无止境的,必须要有明确的目标,避免性价比过低的投入。
关于业务流程,了解业务流程的好处是可以评估压测策略设计是否合理。例如秒杀场景,需要通过“高并发+集合点”的方式来模拟瞬间峰值压力。
基于系统架构信息,结合业务特性,可以评估当前架构是否合理。还是以秒杀场景为例,通常会采用本地缓存或Redis等低延时的缓存中间件来存储商品数量。如果直接读写数据库,并且没有做好超大压力下的限流熔断措施,系统很可能顶不住瞬间峰值压力而崩溃。
对于资源配置信息,合理的资源规划是必不可少的。例如在应用层,如果采用Kubernetes等容器化部署方式可以很方便地扩缩容,以抵御突如其来的峰值流量。但数据库服务器端往往没法做到快速地扩容,因此需要做好提前规划。
在准入阶段,需要考虑准入条件,即满足哪些条件才适合开始性能调优工作。常见的准入条件如下。
对于压测和调优分属两个不同团队的组织架构,通常专门调优的团队的人员规模不会太大,往往需要对全公司多条业务线负责。而且有经验的性能测试人员也很清楚,压测环境准备、数据准备、压测执行和压测结果整理都是比较花费时间的,因此建议在有稳定的压测环境和压测结果数据时,再让调优团队介入分析,提升调优效率。
性能调优是没有极限的,为避免陷入无休止低性价比的盲目调优中去,需要查看使用率等性能指标是否满足预期业务目标。如果未满足,则进行调优;如果已满足,则业务方需要给出合理的理由再进行后续调优。
调优工具所展示的数据是调优人员判断性能瓶颈的依据,导致一种性能异常现象的根因可能有多种,调优人员需要通过工具获取数据来确认性能瓶颈的根因到底是什么,才能快速给出解决方案并进行优化。例如死锁问题可以通过JVisuaIVM来分析,内存漏问题可以通过MAT来分析。
通常在压测过程中我们都会对被测应用进行监控,此时需要注意,被测应用很可能与其他服务或数据库间有依赖关系,这些相关应用和数据库需要一并接入监控。监控应尽可能详细,包括硬件资源监控、JVM监控、数据库监控等。如果系统架构比较复杂,理不清楚依赖关系,可以通过APM类工具来协助梳理链路。有经验的调优人员也可以通过网络或线程Dump来分析是否存在外部依赖,例如通过netstat命令来分析服务是否与外部IP或端口有交互,通过线程Dump也可以看出是在哪个业务方法中出现了与外部服务的交互。
调优的实施过程如下。
性能瓶颈定位就如同侦探破案,是个从现象到本质的分析过程,第一步一定是收集问题的外在表象,例如某个接口响应慢或某个服务资源消耗过高等。
了解现象后,通过监控和分析工具提供的数据不断深挖问题的本质,大部分情况下工具只会展示数据,而不会直接告诉我们结果,所以需要结合这些数据推理出导致这些现象的根因并分析该问题对业务和系统整体性能的影响程度和影响面。
根据性能问题的优化代价(可能是改配置,可能是优化代码甚至可能是调整系统架构),以及问题的影响程度和影响面,结合人力资源、硬件资源、项目周期等条件选择最符合实际、性价比最高的优化方案。
完成优化后,需要验证实际优化效果是否符合预期,如果不符合则需要进一步优化整个流程可能需要多轮优化和验证。
准出条件即满足哪些条件才算完成性能调优工作,常见的准出条件如下。
优化完成后需要通过复测结果来验证优化效果,确认优化后性能指标是否满足需要。如果指标已经满足,并且暂时未发现极高性价比的优化点时,应及时结束调优,为系统后续发布流程空出时间。
所有的性能优化都不应以牺牲功能正确性为代价,在不确定性能优化是否会影响业务逻辑时,应在优化后先进行功能回归测试,确认功能不受影响。
该阶段的主要工作如下:
定位性能瓶颈、出具调优方案、记录优化效果,逐步形成企业内部调优知识库的资产。
在调优过程中可能会走一些弯路,走向错误的排查方向,通过复盘可以总结现象和根因间的规律,总结类似问题的排查方向和技巧。
定期将调优知识库以及与问题相对应的排查技巧、现象与根因间的规律等进行分享或培训,避免其他业务线或项目组踩同样的“坑”,提升团队整体的问题排查思路和技术水平。可以对问题进行分级,将出现频率较高、排查路径和调优方法比较明确的问题及其解决方案,优先整理并分享出来。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。