IO问题往往是导致数据库性能问题的重要原因。
数据库的作用就是实现对数据的管理和查询。任何一个数据库系统,必然存在对数据的大量读或者写或者两中操作都大量存在。
希望帮助大家在理解Oracle的读写操作机制的基础上,灵活解决遇到的各种常见的IO问题。
— Oracle中IO的产生 —
由于内存的读写效率比磁盘的读写效率高万倍,因此,为了降低IO wait,oracle会将数据cache在内存(Buffer Cache)中,对数据的读写尽量在内存中完成(直接路径读写)。
当Buffer Cache中的数据缓存块被修改过了,它就被标记为“脏”数据。根据LRU(Least Recently Used)算法,如果一个数据块*近很少被使用,它就称为“冷”数据块。
进程DBWn(系统中可以存在多个DBW进程,n为序号)负责将“冷”的“脏”数据写入数据文件中去(错误,是根据检查点队列)。
DBWn进程会在以下两种情况下将“脏”数据写入磁盘中去:
1.当服务进程扫描一定数量(阀值)的Buffer Cache后还没有找到干净、可重用的缓存块后,它会通知DBWn进程将“脏”数据写入文件中去,以释放出空闲缓存;
2.当发生检查点(Checkpoint)时。直接路径读,是直接把数据读出来,并不想共享数据(对于批量数据读写)。
— IO系统的设计和配置 —
要控制好数据库的整体IO性能,在规划数据库架构时就需要做好IO系统的设计和配置。例如,将对IO要求不同的文件放置在不同的存储设备上;规划数据文件的分布、均衡IO负担等。
IO性能是直接和操作系统的硬件性能相关的。如果能利用操作系统的一些高级IO特性,或者采用更高速的磁盘设备,能大大提高IO性能。
我们知道,内存的读写效率比磁盘高近万倍,因此Oracle在内存中开辟了一片区域,称为Buffer Cache,使数据的读写尽量在Buffer Cache中完成。
同样,在文件系统中,操作系统为了提高读写效率,也会为文件系统开辟一块Buffer Cache用于读写数据的缓存。这样,Oracle的数据会被缓存2次。
— 负载均衡及条带化 —
当多个进程同时访问一个磁盘时,会出现磁盘冲突。大多数磁盘系统都对访问次数(每秒的IO操作)和数据传输率(每秒传输的数据量)有限制。
当达到这些限制时,后面要访问磁盘的进程就需要等待,这时就是所谓的磁盘冲突。
避免磁盘冲突是优化IO性能的一个目标,这就需要将一个热点磁盘上的IO访问负载分担到其他可用磁盘上,也就是IO负载均衡。在一些成熟的磁盘负载均衡技术出现之前,DBA需要了解/预测各系统的IO负载量,通过手工配置每个数据到不同存放位置以分担IO负载来达到负载均衡的目的。
条带化技术就是将数据分成很多小部分并把他们分别存储到不同磁盘上的不同文件中去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突。很多操作系统、磁盘设备供应商、各种第三方软件都能做到条带化。通过条带化,DBA可以很轻松的做到IO负载均衡而无需去手工配置。
— RAID —
RAID的全称是独立磁盘冗余阵列(Redundant Array of Independent Disks)。它通过将多个相对比较便宜的磁盘组合起来,并相互连接,同时都连到一个或多个计算机上,以组成一个磁盘组,使其性能和容量达到或超过一个价格更昂贵的大型磁盘。RAID分为6级。
— SAN —
SAN(Storage Area Network,存储区域网)是一个高速的子网,这个子网中的设备可以从你的主网卸载流量。通常SAN由RAID阵列连接光纤通道(Fibre Channel)组成,SAN和服务器和客户机的数据通信通过SCSI命令而非TCP/IP,数据处理是“块级”(block level)。
SAN通过特定的互连方式连接的若干台存储服务器组成一个单独的数据网络,提供企业级的数据存储服务。 SAN是一种特殊的高速网络,连接网络服务器和诸如大磁盘阵列或备份磁带库的存储设备,SAN置于LAN之下,而不涉及LAN。
利用SAN,不仅可以提供大容量的存储数据,而且地域上可以分散,并缓解了大量数据传输对于局域网的影响。SAN的结构允许任何服务器连接到任何存储阵列,不管数据置放在哪里,服务器都可直接存取所需的数据。
— NAS —
NAS是Network Attached Storage(网络附加存储)的简称。在NAS存储结构中,存储系统不再通过I/O总线附属于某个服务器或客户机,而直接通过网络接口与网络直接相连,由用户通过网络访问。
它是连接到一个计算机网络的文件层的数据存储,它可以为不同网络客户端提供数据存储服务。NAS的硬件与传统的专用文件服务器相似。它们的不同点在于软件端。
NAS中的操作系统和其他软件只提供数据存储、数据访问功能,以及对这些功能的管理。与传统以服务器为中心的存储系统相比,数据不再通过服务器内存转发,直接在客户机和存储设备间传送,服务器仅起控制管理的作用。
— IO配置 —
在借助各种成熟的存储技术的基础上,合理配置系统的IO分布及系统IO配置能大量减少系统在生产运行中出现IO性能及相关问题的几率。
当然,这些配置是我们在布置数据库系统时初始建议,对于复杂的系统来说,很多配置(如一些存储相关的参数)是需要根据系统的运行状况进行调优的。
在数据库系统中,如果某个文件或者某块磁盘上存在远远高于其他文件或磁盘的大量IO访问,我们就称这个文件或磁盘为热点文件/磁盘。
我们在做IO规划时的一个重要目标就是要消除系统中热点文件/磁盘的存在,使整个系统的IO负载相对平衡。
— 条带化的设置 —
由于现在的存储技术成熟、成本降低,大多数系统都用条带化来实现系统的IO负载分担。
如果操作系统有LVM(Logical Volume Manager逻辑卷管理器)软件或者硬件条带设备,我们就可以利用这些工具来分布IO负载。
当使用LVM或者硬件条带时,决定因素是条带深度(stripe depth)和条带宽度(stripe width):
条带深度指的是条带的大小,也叫条带单元;条带宽度指的是条带深度的产量或者一个条带集中的驱动数。
需要根据系统的IO要求来合理的选择这些数据。对于Oracle数据库系统来数,比较合理的条带深度是从256K到1M。下面分析影响条带深度和条带宽度的影响因素。
为了提高IO效率,我们要尽量使一次逻辑IO请求由一块磁盘的一次物理IO请求。因而影响条带的一个重要因素就是一次逻辑IO请求的大小。
此外,系统中IO的并发度不同我们对条带的配置要求也不同。
例如,在高并发度且IO请求的大小都比较小的情况下,我们希望一块磁盘能同时响应多个IO操作;
而在那些存在大IO请求的低并发度系统中,我们可能就需要多块磁盘同时响应一个IO请求。无论是一个磁盘还是多个磁盘响应IO请求,我们的一个原则是让一次逻辑IO能被一次处理完成。