文章转自:原创作者:杨建旭,https://mp.weixin.qq.com/s/Ump8jkAdc63miveYOFQHDw
本文不涉及整体架构上的优化,即不讨论怎么提高总体吞吐量,只讨论如何缩短单笔交易的执行时间,虽然这两者是有强关联关系的。(比如说,大多数情况下,缩短单笔交易的执行时间会帮助系统提高最大吞吐量)
我们先从软件层面看,如何提高交易的处理效率
1. 优化编译选项
2. 优化编译的依赖关系。
例如:使得动态链接库(so文件)不会轻易被unload,之后又出现load,反复的unload/load非常消耗时间和资源。例如,让动态链接库依赖于一个常驻进程。
3. 降低日志级别、减少日志输出(即减少写IO)
4. 并行写N个日志
多个应用进程并发写N个日志,或者
数据库并发写N个redo log日志(需要自行开发数据库)
5. 使用缓存或者缓存数据库
6. 使用双层缓存,在缓存的基础上再增加一层缓存,变成两层缓存
7.使用内存数据库,设置数据不落盘
8. 减少冷启动时间
定时唤起睡眠的函数,基于预测做函数预热,根据业务情况调整阈值,应对函数休眠、重启、资源扩容、初始化
9. 优化代码算法
10. 无需查找的“查找算法”
例如:
请求包中带上关键索引ID等信息,直接定位;
表结构中增加关键索引/指针信息,直接定位;
为关键使用频率高的信息增加缓冲池,缩小查询范围
11. 优化备份机制
第一, 备份要系统资源(CPU、网络、存储),无形中会拖慢整个系统运行速度。
第二, 如果是数据同步备份,需要一笔业务双写到两份存储后才能返回成功。响应时间变长
可以做的应对方式
a)取消备份机制,单机运行
b)优化备份机制:比如1主6备,改为1主2备(2备再拖4备)
从硬件层面看,如何提高交易的处理效率
1. 采用物理机而非虚拟机
虚拟机在各个层面(CPU、网络、存储)都有额外的虚拟化管理的消耗。而采用物理机无疑没有这方面的额外消耗。
注:采用物理机(而非虚拟机)会导致系统没有虚拟化层的高可用保证(比如HA、vSAN等等),也会失去虚拟化带来的管理便利。
2. 采用更高端的硬件设备
更强的CPU、网卡、存储服务器、交换机
3. 采用一体机(比如数据库和存储的一体机)
历史上是两个设备,后来整合到一个设备,以减少执行时间
4. 采用专用设备
采用低延时网卡缩短网络延时
1000M网卡延时为40-100us,
10G网卡延时为15us,
专业的低延时网卡为2.0-4.3us。
5. 采用新技术
例如
机械磁盘换为SSD
磁盘换为非易失性内存(这个算比较新的硬件,所以现在用的没那么普遍)
6. 亲和性
a)CPU亲和性:
a.1 进程绑定CPU,让一个进程只跑在一个固定的物理CPU上。这样可以进程数据在不同CPU之间的上下文切换。
a.2 使进程数据在CPU cache当中持续存在,定时发送指令,做数据保持。
b)网络亲和性:在有多条网络路径、存储路径的情况下,主动选择速度较快的链路。
上述一些方法(如取消备份机制、数据不落盘等等)会降低系统的可靠性,出现丢数据的可能,在应用时,需要采用额外的补偿机制(比如日终对账的方式)来找补错误,这种补偿机制是另一个系统/服务器来实现。另外,要帮助用户知晓、理解和承担交易失败导致的风险。