性能优化的核心思想

1.代码质量

代码质量决定了系统性能的基准,这方面的提升主要看工程师对编程语言的经验积累,包括对依赖类库的熟练程度。比如拿序列化组件来说,序列化时,fastjson更快,反序列化时jackson更快。结合不同场景选择不同的组件。

2.中间件层

一般来说中间件层都会对外暴漏参数,对这些参数的理解,也会很大程度上影响性能。比如是否开启压缩,如果你的CPU资源充足,传输内容又很大时,优化效果就比较明显。再比如连接池的配置,是长连接还是短连接?是同步还是异步?就java语言来说,JVM调参也属于这一层,需要你对JVM的结构和垃圾回收机制有比较深刻的理解。

3.系统架构设计层面

a.合理的模块依赖关系

一个请求依赖路径上的模块是否达到最简。比如一个业务请求需要6步来完成,经过业务梳理你发现其实必须当时完成的只有前3步,4是更新汇总表,可以去掉,改为定时任务来更新。5是写日志,可以改为异步写。6是通知其他相关系统,可以改为发消息到队列,不必同步等待结果。这样原来需要6步的操作改为3步,响应时间大大缩减。

b.异步请求

如果请求路径已经不能再缩减,那么是否能改为异步请求呢?比如一个请求中两个操作,如果它们没有先后依赖关系,可以启动两个线程一起执行,等待结果后再一起返回即可。但如果这两个操作都是CPU计算,那么我们一般不会去并行。因为CPU的核心线程数有限,CPU并行操作计算后,看似当前的CPU利用率更高,但其实每个线程都这么抢,没什么意义,反而会增加线程切换的成本,让系统的吞吐量在高压下衰败的更快。

c.缓存的使用

可以根据需要建立不同级别的缓存,如本地缓存,分布式缓存Redis来提升系统性能,但这里需要关注缓存的关注时间,做好数据时效性和访问效率之间的平衡。此外,Redis这种分布式缓存,也可以采用主动更新的方式,但本地缓存一般不这么干。其实,前端常用的CDN,也是采用这样的策略,本质上也是一种缓存,是对静态数据的访问提速方案。

d.池化

连接可以池化变连接池,线程可以池化变线程池。所有创建成本高的对象,都可以采用预建的方式,减少系统的等待时间。

e.如果是机器学习应用,还可以采用异构计算,用GPU给计算密集型任务提速。有些CPU也支持SIMD,也就是单指令,多数据流,但这个还得要看具体编程语言的支持。

3.数据库层面的优化

关系型数据库重点关注表结构的设计、索引的建立和SQL的编写,非关系型要具体结合产品做优化,比如Mongo的分区设计,HBase的Rowkey设计。

说了这么多我们来稍微总结一下,其实系统优化就以下两个核心思想,一是节约,二是平衡。减少请求依赖是节约、优化代码执行路径也是节约,因为性能优化就是在有限资源的前提下进行的,首先要做的就是尽可能的减少不必要的消耗。在做好了解约后下一步就是平衡,系统性能上不去就是因为在某个方面遇到了瓶颈点,可能是CPU计算资源,也可能是内存资源,也可能是IO资源。我们优化就是去消灭这一个个瓶颈点,去往相对不紧张的资源去转化,去平衡。开启压缩,是提高了CPU的计算成本,但减少了传输成本;建立缓存是提高了内存成本,但是降低了数据访问成本;池化,是提高了内存成本,但是降低了CPU计算成本;对机器各种资源的消耗整体平衡了,没有瓶颈点了,那这台机器的价值才算是被我们榨干了,系统的整体吞吐量才能达到最大。

你可能感兴趣的:(分布式)