性能优化分享篇

云开发产品技术讨论,包括IoT Core和其他云服务API、数据分析产品等话题


Post Reply
norman
Posts: 8

一、认识性能优化
为提升框架侧用户体感,最近半年我一直在做SaaS运行时性能优化的事项。年前我完成了一个核心接口的性能优化,我完完整整进行了3次优化,从平均1200ms到现在的20ms,实现很大的一个跨度。而我们团队维护的接口从均耗最高的接口2.3s(前期代码问题导致),降低到现在全部接口均耗在200ms左右,优化效果明显。当然我的各项优化任务还在继续,更优的SaaS体验期待你的见证。而在我真正实施的过程中,一直在考虑下面2个问题:

  • 我该从哪里开始做性能优化?

  • 我们应该如何建立长期的关注性能的团队文化?

带着这两个问题,我们来认识下什么是性能优化。简言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。带着这个认知,让我们一起去成长吧。

二、性能优化的基本原则

  • 脱离场景谈性能都是耍流氓

实际的性能分析调优过程中,我们需要根据具体的业务场景,综合考虑成本和性能,使用最合适的办法去处理。系统的性能优化到 3000QPS 如果已经可以在成本可以承受的范围内满足业务发展的需求,那么再花几个人月优化到 3100QPS 就没有什么意义,同样地如果花一倍成本去优化到 5000QPS 存粹是浪费资源。

  • 过早的优化是万恶之源

我们需要考虑在恰当的时机去优化系统。在业务发展的早期,量不大,性能没那么重要。我们做一个新系统,先考虑整体设计是不是 OK,功能实现是不是 OK,然后基本的功能都做得差不多的时候,再考虑性能的优化工作。因为如果一开始就考虑优化,就可能要想太多导致过度设计了。而且主体框架和功能完成之前,可能会有比较大的改动,一旦提前做了优化,可能这些改动导致原来的优化都失效了,又要重新优化,多做了很多无用功。

  • 瓶颈问题都遵循巴莱多定律(也叫二八定律)

随着业务的发展,业务系统性能一般都存在瓶颈问题,而瓶颈问题都遵循 80/20 定律。性能优化本身就是一个长期任务,不能拍脑袋去定不切实际的目标。我们把整个接口处理过程中比较慢的因素都列一个清单,并按照对性能的影响排序,那么前 20% 的瓶颈问题,至少会对性能的影响占到 80% 比重。换句话说,我们优先解决了最重要的几个问题,那么性能就能好一大半,这也正是我前期一直在解的问题。而我当前正在进行的SDK改造项目,也是属于20% 的瓶颈问题。

  • 考虑正确性与ROI

性能优化的同时一定要考虑正确性,如果优化之后连正确性都无法保证优化有啥意义呢?而更稳妥的方案是,让你团队内能全面掌握整个领域的技术牛人去把控,我想你能看到更高的正确性。当然,性能优化必然要伴随着更多的测试来保证正确性。另一个问题,如果一个功能投入很大,优化效果不好,那么是不是要三思而后行呢?请say NO!

  • 考虑拓展性、可读性

性能很好,但是可读性很差,可拓展性、安全性很差,那么就容易埋下很多隐患。比如为什么外国人很少用 fastjson,其中一个重要原因是里面有很多硬编码的东西,而且总是爆出安全漏洞。

  • 建立性能优化的文化

集中式的性能优化只是开始,到了项目后期,作为团队的成员,时不时的小优化才是保持系统良好性能的唯一方向。但更重要的是:在头脑中明确当前项目的性能目标,因为这将影响整个开发过程中代码的coding方式。待基本面上的问题解决后,我也会逐步推进这个事项。

三、性能优化四步走
Image

  • 第一步:制定指标,收集数据。

通过技术手段,找到当前系统性能衡量的可靠指标。本次呢,我这里就结合大数据平台数据统计功能,做了定制化数据统计。产出了如:7日接口调用次数、平均接口耗时、最大接口耗时等指标。当然用户访问量大的时候,对网络有任何抖动都可能会导致最大响应时间变得非常大,最大响应时间这个指标不可控,一般我们也不会直接用,不过我们也会统计出来做为参考数据。这样的数据的统计呢,后续也将每天邮件抄送每位业务开发同学,来帮助每位系统开发的参与者更好的完成自己项目性能指标。当然,一定要结合场景合理制定目标,最忌讳的是拍脑袋定目标,完全不切实际的优化目标,除了打击项目参与者的积极性,得不来任何更好的结果。

  • 第二步:分析问题,找到瓶颈。

在系统的日常运行过程中,持续观察,逐步调整和收集以上数据,进行系统的分析,列出各项瓶颈问题,并评估问题的影响面。在我早期的优化方案文档中,我梳理了当前系统的核心问题,以及基本的解决思路,这也帮助我在优化项目中能够按既定目标更好的落地。

  • 第三步:制定方案,调整配置。

优化是一个长期任务,制定执行计划,分阶段完成既定目标。在优化阶段,伴随着框架侧接口性能的整体提升,我发现自己从代码改造、系统架构、数据缓存等方面,经历和完成了大大小小近十次优化任务。

  • 第四步:逐步改进,持续观察。

性能优化本身就不是一蹴而就的事情,很多时候我们按既定目标执行,可能也不见得能收获明显的优化效果。遇到问题一定要戒骄戒躁,耐心分析,避免消极懈怠。从多角度、全方位排查,找到问题的解决思路,调整优化方向。另外,如果你的团队不能形成良好的优化文化,你可能会看到这样一种情况:短期内优化效果明显,但后续别人的相关逻辑改动可能也会影响之前你的优化效果,这也说明了团队建立性能优化文化的重要性。正是这样,一个优秀的团队,势必也会将代码质量和代码优化放在首要位置。

Norman!
Norman!
Norman!


Tags:
Post Reply