性能优化核心思想:个人笔记
个人笔记,内容大部分来自架构技术:性能优化的核心思想。
1 基本代码层面:
- 合理的数据结构,合理的算法复杂度。 例如,一批常驻内存的数据的高频查找功能。使用hash数据结构比数组的效率更高。
- 熟悉工作语言的相关库,例如,
C++ STL
的map
和unordered_map
,需要根据自己的使用场景特性,选择合适的结构。
2 使用框架、中间件层面:
- 需要理解所使用框架的相关配置:例如一些数据传输前的压缩处理(CPU充足,数据量大但网络传输资源不足的条件下)
- 使用方式选择:网络通信时用长连接短(一般内网服务间相互通信使用长连接)还是短连接(一般对外的访问接口使用短连接)
- 连接池的使用,同步通信和异步通讯的选择。
3 系统架构设计层面:
3.1 合理的模块依赖关系:
一个请求到达后,经过的所有模块(或微服务)是否达到了最简?
- 例如,一些后置处理是否可以延后执行?将结果先临时写记录,累计到一定数据再进行批量后处理。
- 例如,同步写日志操作,改为异步写方式
- 例如,使用同步接口通知其它服务某个事件,并等待返回的操作。是否可以改为异步接口通知?
- 例如,对于不需要立即处理的请求,可以将请求数据发送到消息队列系统,下游服务自己在消息队列系统中订阅相关消息。(可以带来功能解耦的额外好处,并且对于请求流量存在高低峰值的场景也可以抹平流量,合理充分的利用资源)
3.2 并行处理:
例如,加载一个大文件内容到内存,可以通过多线程并行,每个线程读取文件部分数据(通过fstream对象的seekg定位到不同的起始读位置)。
例如,当请求到达后,开启其它线程去执行相关工作。本线程继续等待其它请求。
PS:CPU的核心数有限,服务器上一般会存在各种服务应用程序在运行。因此,对于计算密集型任务,并行度不应该太高。否则(大于CPU核心数),线程间就要频繁切换,反而造成CPU利用效率变低(即看起来是CPU利用率变高了。但频繁的任务切换,本身也需要CPU资源,导致CPU实际执行真正工作的时间的占比反而降低)。
3.3 使用缓存:
根据需要建立不同级别的缓存。
例如,大规模的数据查找一般会有分层结构,如第一层是内存级别的缓存,下一层是固态硬盘缓存,最下一层是机械磁盘。 速度逐渐降低,但成本也更低。这种分层下,内存缓存基本可以直接命中高频热点请求,低频请求可以在固态硬盘缓存中命中,只有很少量的长尾请求才会需要去最底层的机械硬盘上查找。
3.4 池化:
连接池、线程池,所有创建成本高的资源或对象,都可以通过池化的方式提前创建好。
3.5 异构计算:
深度学习应用,可以使用GPU加速运算。
CPU上也可以看是否可以使用单指令多数据流(SIMD)来提高计算速度。