优化准则
在数据库优化中,主要有以下优化指标。
响应时间:衡量数据库系统与用户交互时多久能够发出响应。
吞吐量:衡量在单位时间内可以完成的数据库任务。
进行数据库优化时,笔者都是围绕着上述指标进行优化的。
数据库优化工作中,第一项就是确定优化目标。
性能目标:如CPU利用率或IOPS需要降到多少。
响应时间:需要从多少毫秒降到多少毫秒。
吞吐量:每秒处理的SQL数或QPS需要提高到多少。
一个已运行的数据库系统,如果前期设计不合理、性能不高,后期在优化时会非常困难,有可能永远无法达到高性能,因此,在新建一套数据库系统前,首要的事应该是设计优化。良好的设计能最大限度地发挥系统的性能。
优化方法
优化的第一件事是确定目标,那么要如何确定一个合理的目标呢?这就需要使用测试工具。熟练使用常用的测试工具是做数据库优化的基础。下面是一些常用的测试工具。
·memtest86+:内存测试工具。
·STREAM:内存测试工具。
·sysbench:综合测试工具,可以测试CPU、I/O、数据库等。
·pgbench:PostgreSQL自带的测试工具,可以仿真TPC-B的测试模型。
·fio:最强大的免费I/O测试工具。
·orion:Oracle的I/O测试工具,测试裸设备的I/O能力,功能比fio要少,但使用简单。
熟练掌握以上几种测试工具的使用方法,对数据库的优化很有帮助。
硬件知识
CPU及服务器体系结构
服务器系统可以分为以下几种体系结构。
(1)SMP/UMA -Symmetric Multi Processing/Uniform Memory Architecture
·优点:服务器中多CPU对称工作,无主次关系。各CPU共享相同的物理内存,访问内存任何地址所需的时间相同,因此程序设计较为简单。
·缺点:因多CPU无主次关系,需要解决内存访问冲突,所以硬件实现成本高。
(2)NUMA-Non-Uniform Memory Access
·优点:多CPU模块,每个CPU模块具有独立的本地内存(快),但访问其他CPU内存(慢),硬件实现成本低。
·缺点:全局内存访问性能不一致;设计程序时需要特殊考虑。
(3)MPP-Massive Parallel Processing
·优点:由多个SMP服务器通过节点互联网络连接而成,每个节点都可访问本地资源(内存、存储等),完全无共享(Share-Nothing)。最易扩展,软件层面即可实现。
·缺点:数据重分布;程序设计复杂。
目前,Intel的X86架构属于NUMA架构。Intel的Nehalem的架构图如图所示。
Intel的Nehalem的架构图(引用自Intel官网)
从图中可以看到,两颗4核的CPU通过总线连接,内存分别连接到各自的CPU上。所以从一个CPU的内存访问挂在另一个CPU上的内存,速度会慢一些。
下面介绍一些CPU的相关知识。先看看CPU的部分术语。
·主频:CPU的时钟频率,内核工作的时钟频率。
·外频:系统总线的工作频率。
·倍频:CPU外频与主频相差的倍数。
·前端总线:将CPU连接到北桥芯片的总线。
·总线频率:与外频相同,或者是外频的倍数。
·总线数据带宽:(总线频率×数据位宽)/8。
Intel CPU有以下3级cache。
·L1、L2级cache:核心core独占;带宽为20~80GB/S;延时为1~5ns。
·L3级cache:核心core之间共享;带宽为10~20GB/S;延时为10ns。
Intel CPU通过QPI(QuickPath Interconnect技术)与其他CPU通信,QPI大约在20GB/s。
内存
内存是CPU与外部沟通的桥梁。CPU运算时所需的数据都临时保存在内存中,计算机的所有程序也都运行在内存中,内存通常也用于硬盘等外部存储器的数据缓存。
内存从硬件上分为以下几种。
·SRAM:静态随机存储器。随机是指数据不是线性依次存储的,而是自由指定地址进行数据读写的。CPU的cache一般使用这种存储方式,特点是速度快但造价高,不能大规模使用。
·DRAM:动态随机存储器。动态是指存储阵列需要不断刷新来保证数据不丢失。造价比SRAM低得多,但速度也慢一些。
·SDRAM:同步动态随机存储器,同步是指工作时需要同步时钟,内部命令的发送与数据的传输都以它为基准。
·DDR SDRAM:双倍数据传输率的SDRAM,DDR是“Double Data Rate”的缩写。普通的SDRAM在一个时钟周期内只传输一次数据,即它在时钟的上升期进行数据传输;而DDR内存则在一个时钟周期的上升期和下降期各传输一次数据,因此称为双倍速率同步动态随机存储器。DDR内存又分DDR1、DDR2、DDR3、DDR4几种,分别对应第一代、第二代、第三代、第四代DDR。目前主流的内存为DDR4内存。
硬盘
硬盘按接口可以分为以下3种。
·ATA系列:包括较早的硬盘接口,比如IDE(Integrated Drive Electronics)、PATA(Parallel ATA)及SATA(Serial ATA)。
·SCSI系列:包括早期的并行SCSI和现在使用较广泛的SAS(串行SCSI)。
·FC接口:支持FC协议接口的硬盘。
FC接口的硬盘一般只在专用存储上使用,通常见到的硬盘都是SATA或SAS接口的。
硬盘按存储介质来区分,可以分为以下两种。
·HDD:普通机械硬盘。
·SSD:固态硬盘。
机械硬盘和SSD硬盘都有SATA和SAS接口的这两种。
硬盘通常通过SAS或SATA接口的卡连接到主机上。SAS卡既能接SAS硬盘,也能接SATA硬盘,但SATA卡只能接SATA硬盘。
目前SAS的接口速度一般是3Gb/s或6Gb/s。
目前在服务器上使用的硬盘其大小有以下两种:
·2.5英寸。
·3.5英寸。
当前SSD硬盘的大小一般是2.5英寸。
机械硬盘的转速通常有以下几种:
·7200转,目前大多数的SATA硬盘都是7200转。
·10000转。
·15000转。
转速的单位是转/分钟,也就是10000转的硬盘的转速实际是1分钟10000转。
机械硬盘有以下性能指标。
·平均寻道时间(E):15000转的SAS硬盘为4ms左右。
·旋转延时(L):15000转的SAS硬盘为2ms左右。
·内部传输时间(X):通常为0.8ms。
·吞吐率(Throughput):15000转的SAS硬盘为170Mb/s左右,机械硬盘为50~200Mb/s。
·磁盘服务时间:RS=E+L+X=6.8ms。
·硬盘的IOPS:可以算出硬盘的IOPS=1/RS=1000ms/6.8=147。
SSD硬盘一般分为如下两种。
·SLC:是“Single Layer Cell”的缩写,特点是成本高、容量小、速度快,约10万次擦写寿命。
·MLC:是“Multi-Level Cell”的缩写,特点是容量大、成本低,但速度慢,约1万次擦写寿命。
·TLC:是“Trinary-Level Cell”的缩写,特点是容量最大、成本最低,但速度最慢,约1000次擦写寿命。
MLC并不像SLC一个单元只对应一个比特位。SLC一个单元,根据电压的高低只对应一个比特位,不是0就是1,而MLC一个单元根据电压的高低存储多个值,如0、1、2、3等4个值。所以在MLC中,同样的一个单元中可以存储更多的数据,但也因此要通过不同的电压值来识别出多个值,不像SLC只需要识别出两个值就可以了,所以MLC识别一个单元值的出错概率会增加,必须进行错误修正,这就导致其性能大幅落后于结构简单的SLC闪存。也正是因为这个原因,MLC闪存的复写次数通常只有SLC的十分之一。
TLC利用不同电位的电荷来存储,一个浮动栅存储3个bit的信息,TLC的复写次数通常只有MLC的十分之一。目前因为价格的原因,SLC的SSD基本看不到了,大都是MLC和TLC的SSD。
服务器上使用的SSD硬盘的性能指标如下。
·IOPS:读通常可以达到几万以上,写通常在几千以上。
·吞吐率:读通常可以达到250Mb/s以上,写通常可以达到150Mb/s以上。
·响应时间(Latency):读在几十微秒到100微秒之间,写在200微秒到1毫秒之间。擦除时间在2毫秒左右。
SSD硬盘与机械硬盘最大的差别有以下几点:
·SSD的随机性能好。SSD的读IOPS通常在机械硬盘的两个数据级以上,写IOPS也至少是1个数量级以上。但读写吞吐率一般只有机械硬盘的数倍,最多10倍左右。
·SSD内部存在擦除。也就是在重写旧数据时,不能像机械硬盘一样直接改写,而是需要经过一个擦除的过程后,才能再写。每次擦除的数据块比读写的块要大很多,通常在128KB到512KB之间,而读写的块大小通常为4KB。
·SSD中闪存芯片的写次数是有限的,写到一定次数时就会损坏。这个次数通常为10000~100000次。所以SSD内部需要一定的算法,让写比较平均地分散到其他各处。也就是说,如果一直写SSD硬盘的相同逻辑地址的同一个位置,实际写的物理芯片并不是同一个位置。
由于物理所需要的“擦除”特性及写寿命等原因,SSD硬盘存在着写放大的情况,也就是说,外部写4K的数据,内部实际写的数据量有可能大大超过这个数值。具体会产生多少的写放大,与应用的I/O特点以及不同SSD厂家内置在SSD内部的平衡写的算法有很大关系。不同厂家的产品会有很大的不同。所以对于考察一款SSD硬盘,除了看IOPS和吞吐率外,还需要测试其I/O性能的抖动情况。
SSD硬盘内部通常有以下几种优化。
·FTL(Flash Translation Layer):物理逻辑地址映射。防止某个逻辑地址写太多次数而损坏芯片。
·Reclamation:异步擦除策略,降低延时。
·Wear Leveling:均衡写磨损,延长寿命。
·Spare Area:预留空间,减少写放大。一般情况下,SSD出厂后,内部会有一部分预留空间,而Intel的SSD用户还可以再多预留一部分空间,这样可以提高写性能。