在程序员的职业生涯中,解决当前系统问题,优化性能,是走向高阶的必经之路。如果一辈子做着后台开发,写着CRUD,QPS低于10,那确实没必要去做性能优化,因为根本用不上。性能优化范围很广,慢SQL优化,接口性能优化,功能模块性能优化,以及系统性能优化,最近一段时间刚好做完系统性能优化,就简单聊一聊性能优化。
犹记得当年和同事谈笑,说起应对高并发流量的阿里三板斧:tair、分库分表、堆机器。直白点来讲,就是加机器资源、用缓存、优化数据库(分库分表)。系统性能优化和这差不多,只是有了资源限制。什么叫性能,通常来讲,就是处理能力和响应时长,在相同cpu和内存,甚至更少的cpu和内存情况下,如何增加系统的处理能力以及降低系统的响应时间,就是性能优化的目的。
在做性能优化前,需要弄明白一个问题:什么消耗了资源和时间?代码逻辑执行(CPU指令执行)、数据库访问(SQL)、网络、IO、HTTP连接、dubbo调用等等,都会消耗资源和时间,耗时排序(从高到低)基本如下:数据库访问 > HTTP请求 > DUBBO调用 >代码逻辑执行。基于上述的分析,为了提升性能,就得减少DB/HTTP/DUBBO的访问,甚至是不访问,如果不访问,数据来源于哪里,这就得用到缓存,目前比较流行的缓存是Redis。
基于上述分析,做了第一版优化,去掉了90%以上的http请求和dubbo调用,所有的原始数据存放到redis里面,业务组件直接从redis缓存取数,业务执行过程中产生的数据也存放到Redis,优化出了第一个版本
优化完成之后,性能有显著提升,并发路数提升了近20倍,cpu和内存基本持平,但是网络带宽随着并发路数而急速上涨。为了解决网络带宽问题,通过wireshark抓包,再结合代码分析,找出频繁访问的数据,以及比较大的数据,将这部分数据从redis中取出来,放入内存中,这就是多级缓存。
在资源持平的条件下,优化之后,系统吞吐量提升了20倍左右,网络带宽降低了90%,响应时间减少了75%。对于这次的性能优化而言,核心思想就是用空间换时间。不管是引入Redis缓存还是系统缓存,以及没有展开讲的资源池化、串行改并行等等,本质上都是拿空间换时间。