优化准则

在数据库优化中,主要有以下优化指标。

响应时间:衡量数据库系统与用户交互时多久能够发出响应。

吞吐量:衡量在单位时间内可以完成的数据库任务。

进行数据库优化时,笔者都是围绕着上述指标进行优化的。

数据库优化工作中,第一项就是确定优化目标。

性能目标:如CPU利用率或IOPS需要降到多少。

响应时间:需要从多少毫秒降到多少毫秒。

吞吐量:每秒处理的SQL数或QPS需要提高到多少。

一个已运行的数据库系统,如果前期设计不合理、性能不高,后期在优化时会非常困难,有可能永远无法达到高性能,因此,在新建一套数据库系统前,首要的事应该是设计优化。良好的设计能最大限度地发挥系统的性能。


优化方法

优化的第一件事是确定目标,那么要如何确定一个合理的目标呢?这就需要使用测试工具。熟练使用常用的测试工具是做数据库优化的基础。下面是一些常用的测试工具。

·memtest86+:内存测试工具。

·STREAM:内存测试工具。

·sysbench:综合测试工具,可以测试CPU、I/O、数据库等。

·pgbench:PostgreSQL自带的测试工具,可以仿真TPC-B的测试模型。

·fio:最强大的免费I/O测试工具。

·orion:Oracle的I/O测试工具,测试裸设备的I/O能力,功能比fio要少,但使用简单。

熟练掌握以上几种测试工具的使用方法,对数据库的优化很有帮助。


硬件知识

PG--数据库优化--硬件篇_服务器

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的架构图如图所示。

PG--数据库优化--硬件篇_服务器_02

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用户还可以再多预留一部分空间,这样可以提高写性能。