首页 > Linux操作系统 > Linux操作系统 > tuning 第八章
第八章 I/O的配置和设计
一、I/O综述
每个数据库都会从磁盘读写数据,产生磁盘 I/O。
很多软件的性能都收到i/o性能的限制。需要花费大量的cpu时间等待i/o。
如果系统I/O达不到 可接受时间,进行i/o的调优可以调高性能,对其他方面的性能问题,调整i/o则不会改善性能。
在设计系统i/o时,需要考虑系统的需求:
存储方面,比如磁盘的最小容量应该达到多大
可用性,是否是7*24的
性能,I/O的影响时间要求等
开发I/O的设计计划时,使用oracle automatic storage management(ASM)。
ASM是整体的高性能数据库文件系统,基于数据库的存储进行管理,而不是管理员的要求。
oracle建议使用ASM进行数据库文件存储,而不是使用裸设备或操作系统文件系统。oracle ASM的主要优点在于:striping(条带管理)、mirroring(镜像)、在线存储管理和动态平衡、managed file creation and deletion
二、I/O的配置
设计应该在保持可用性、可恢复行和性能的前提下尽可能简单。设计越复杂,管理、维护就越难。
如果操作系统是LVM软件或基于硬件的条带化,可以使用这些工具来分散I/O。
使用lvm或硬件条带化需要决定条带宽度和条带深度(stripe width and stripe depth)
oracle系统的可接受stripe depth在256KB~1MB。不同类型系统适应不同配置。
主要取决于:
1)requested I/O size
包括如下参数
DB_BLOCK_SIZE
The size of single-block I/O requests. This parameter is also used in combination with multiblock parameters to determine multiblock I/O request size.
OS block size
Determines I/O size for redo log and archive log operations.
Maximum OS I/O size
Places an upper bound on the size of a single I/O request.
DB_FILE_MULTIBLOCK_READ_COUNT
The maximum I/O size for full table scans is computed by multiplying this parameter with DB_BLOCK_SIZE. (the upper value is subject to operating system limits). If this value is not set explicitly (or is set to 0), the default value corresponds to the maximum I/O size that can be efficiently performed and is platform-dependent.
SORT_AREA_SIZE
Determines I/O sizes and concurrency for sort operations.
HASH_AREA_SIZE
Determines the I/O size for hash operations.
除了I/O大小,并行度也有助于设置理想的stripe depth。选择stripe width和stripe depth时需要考虑:
低并发系统中确保一次I/O不会访问磁盘两次。比如,stripe width是4,strpe depth是32K。如果有一个1MB的I/O需求,每个条带的磁盘需要8次I/O。为了避免这种情况,平均I/O应该小于stripe width(multiplied 编译贴合stripe depth)。
If this is not the case, then a single I/O request made by Oracle Database to the operating system results in multiple physical I/O requests to the same disk.
On high-concurrency (random) systems, ensure that no single I/O request is broken up into multiple physical I/O calls. Failing to do this multiplies the number of physical I/O requests performed in your system, which in turn can severely degrade the I/O response times.
2)concurrency of i/o requests
在高度并发小i/o的系统中,例如典型的oltp系统,stripe depth大通常是好的。大于i/o大小的stripe depths叫做coarse grain striping。条带深度应该是db_block_size的整数倍。coarse grain striping允许阵列上的磁盘进行一些i/o。这样,大量的并发i/o可以被一系列条带化的磁盘用小的i/o完成。
i/o很大,比如DSS系统或低并发的oltp系统中,条带深度应该小一些。叫做fine grain striping。其允许对多个磁盘进行单个i/o。对于一次i/o的相应是最大性能的。
oltp系统中,条带深度等于块大小可能会有问题,为了保证安全,可以将其设置为至少两倍。
生产环境下的系统要考虑可扩容性。LVM能够动态配置stripe width,在系统运行情况下改变配置,极大方便了扩容。
但如果LVM不能提供动态的条带增加,就需要选择一个小的,可管理的条带宽度。所有磁盘都加上后,增加条带宽度。
2.手动分配I/O
如果系统没有LVM或硬件条带,i/o就需要手工配置。根据每个文件的i/o要求进行分配和平衡。
这时 应该熟悉数据库文件的i/o需求和系统的负载能力。如果不知道,可以先评估并设置后,在进行调整。
通过文件的大小和磁盘的大小评估数据库的磁盘存储需求。
为每个文件评估一个I/O值。
有一种错误的说法是应该把表和对应的索引分开存储。其实表和索引存在一起不存在争用。
3.什么时候分离文件
不管理使用操作系统的条带还是手工i/o分配,如果i/o设置(布局)不能满足要求的i/o率,就需要将文件分开存储。
此操作既可以在计划阶段,也可以在系统上线后。
文件分开存储的决定只应该是根据i/o rates、可恢复性的考虑或者可管理性的考虑。
文件分离前,再次确认问题真的出在i/o上,这个结论应该是根据对高i/o使用率的调查得到的。
下面说说怎样分离不同类型的文件:
1)表、索引和临时表空间
如果i/o使用率高的文件所在文件包含表、索引,那么先看是否可以通过sql和应用代码的调优来解决问题。
如果文件是临时表空间的,注意能否调整sql语句,避免不必要的排序操作或调整排序。
如果不必要的i/o已经避免了,i/o仍然达不到要求,再考虑将高i/o的文件分开存储。
2)重做日志文件
考虑将重做日志文件从其他文件中分出来,包含:
将所有重做日志文件单独放在一个磁盘上。同时考虑到可用性、可恢复的问题,同组的日志成员放在不同的磁盘上;
将每个重做日志文件组都放在单独的磁盘上,不包括其他文件;
将重做日志文件通过操作系统的条带化工具放在不同磁盘;
不要为重做日志文件使用RAID5
由于重做日志文件是LGWR进程循序写入的,相同磁盘上如果没有并发活动,操作过程会稍快一些。将重做日志文件放在一个分开的磁盘上通常能够保证顺畅运行而不再需要调优。如果系统支持异步i/o但这个特性没有配置,应该测试使用该特性是否能提高性能。LGWR产生性能瓶颈的状况很少见的。
3)归档日志文件
如果归档很慢,确认是否是归档进程和日志写进程之间存在i/o争用,方法是将archiver reads和LGWR分开。
比如系统有四个重做日志文件组,每组两个成员。创建一个段杜磁盘,八个日志文件分别是1a, 1b, 2a, 2b, 3a, 3b, 4a, and 4b。需要四个磁盘。可以在3、4两组日志上进行写,在1、2两组日志上运行归档。
4.三种配置实例
1)每个磁盘都条带化
最简单的i/o配制方法就是将所有文件放在一个卷上,并条带化。为了可恢复,可以用raid1(镜像)。条带单元的大小大于最大i/o大小。性能没有问题。
2)如果归档日志文件和其他文件在一个磁盘上,做条带化,这些磁盘上的i/o在数据库归档时将受到影响。将归档日志文件放在单独的磁盘有如下好处:
归档的效率高
不会影响其他事务
归档日志的磁盘数有归档日志和归档要求的数量决定
3)重做日志放到单独磁盘
update频繁的oltp系统,重做日志写操作频繁。将重做日志文件单独存储好处在于:
重做日志的写入性能提升到最高
重做日志写入不受其他i/o影响
5.oracle管理的文件
如果文件系统包含了所有的oracle数据,可以使用oracle managed files简化管理。oracle使用标准文件系统管理,只需要设置文件系统的目录用来管理特定类型文件即可。可以为文件指定一个默认位置,设置五个不同的locations用于控制文件和在线日志文件。
oracle确保创建唯一的文件并在其不需要时删除。避免了很多误操作。
现在,可以在oracle managed files上创建文件,就文件仍然以原有方式管理。也就是说,数据库可以是oracle managede files 和用户管理的文件混合。
oracle managed files(OMF)还可用于裸设备
调整OMF需要注意:
由于OMF需要使用文件系统,dba不能决定文件放在哪儿了,因此合理的配置很重要
在LVM之上创建OMF是支持条带化的。处于负载均衡和性能考虑,条带化磁盘
OMF在提供动态扩展的LVM上性能良好,如果不能保证,需要逻辑卷尽可能大
OMF在提供大量扩展的文件系统上运行良好
6.选择数据块大小
8kb对于大多数系统就不错了,但oltp系统经常使用更小的块,而DSS系统可能使用更大的块。主要有三方面考虑:
(一个数据库上多种块大小的设置不推荐采用,因为管理负载)
1)reads
不管数据的大小是多少,最终目的是获取到数据所读的数据最少
如果行很小,随机访问为主,应该用小块
如果行小,顺序访问为主,选择大的数据块
如果行很小,既有顺序访问也有随见访问,选择大数据块更好
如果行很大,如LOB字段,选择大块。
2)writes
对于高并发的oltp系统,使用大的块大小时考虑initrans、maxtrans、freelists的设置。这些参数影响着更新并行操作的块。
使用自动段空间管理时,不需要指定freelists。
如果不确定怎么选择,8kb对于大多数交易频繁的系统比较合适。只有使用LOB的系统可能需要8kb以上
3)不同块大小的优缺点
小:
适用于行比较小、随机访问的情况,减少块争用
由于元数据的影响,占用空间较大
对于行很大的情况不推荐使用,因为每个块可能只能存几行,如果一行放不进去,还会产生行链接
大:
块头小,有更多空间存储数据;一次i/o就能读入缓存中;适合顺序访问或大的行(LOB)
如果对小的行进行随机访问,会浪费缓存空间;oltp环境中不利于索引块使用,因为增加了在索引叶子节点上的争用
三、数据库内部的i/o校准(calibration)
oracle的i/o校准特性方便调整存储子系统的性能,并判断i/o性能问题是否有数据库或存储系统引起。
与其他校准工具不同,oracle的i/o calibration使用存储介质的数据文件随机产生i/o,产生的结果更接近于实际。
此外,oracle还提供了orion工具在不安装数据库的情况下评估性能。orion只用于oracle,还能模拟条带化对自动存储管理的影响。
1.i/o校准的先决条件
1)sysdba权限的用户
2)timed_statistics=true
3)允许异步i/o (使用文件系统时可以设置filesystemio_options=setall)
4)查看并确认异步i/o对于数据文件开启
COL NAME FORMAT A50
SELECT NAME,ASYNCH_IO FROM V$DATAFILE F,V$IOSTAT_FILE I
WHERE F.FILE#=I.FILE_NO
AND FILETYPE_NAME='Data File';
每个数据库实例一次只能进行一个校准
2.运行i/o calibration
dbms_resource_manager.calibrate_io过程,在数据库上产生1mb的高i/o的只读负载,来判断最大IOPS(i/o requestes per second)和MBPS(megabytes of i/o per second)
i/o校准发生在两步:
第一步:存储过程进行随机的基于数据块大小的读(database-block-sized reads)(默认是8kb)来获取最大IOPS;actual_latency提供的平均MAX_IOPS。可以通过max_latency指定最大容忍等待事件。
第二步:使用dbms_resource_manager.calibrate_io,随机1mb读数据库实例中的所有数据文件。产生max_mbps,为数据仓库提供重要指标。
如果用户提供了num_physical_disks参数,告诉oracle有多少磁盘,校准会更准确。
由于运行i/o的负载,i/o校准只能在空闲时段进行。
存储过程为:SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
-- DBMS_RESOURCE_MANAGER.CALIBRATE_IO (
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (2, 10, iops, mbps, lat);
DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);
DBMS_OUTPUT.PUT_LINE ('latency = ' || lat);
dbms_output.put_line('max_mbps = ' || mbps);
end;
/
运行该存储过程时,需要考虑:
一次只能为一个使用相同存储子系统的数据库进行校准;
静默数据库使实例的i/o最小
对于RAC,确保所有实例打开,并在节点上来校准存储子系统
RAC数据库的负载是对所有实例进行的
num_physical_disks参数是选配的,设置后能够更快更准确
校准过程中可以通过v$io_calibration_status查看状态。成功执行后可以在dba_rsrc_io_calibrate表看到结果
四、使用orion校准 (i/o calibration with the oracle orion calibration tool)
1.orion简介
不用安装oracle就可以使用
对于不同的负载(small random i/o、large sequential i/o、large random i/o、mixed workloads),可以进行不同的i/o负载测试,得到mbps、iops、i/o latency
目标
1)DAS(direct-attached) storage:一个或多个本地磁盘、卷或文件的性能
2)SAN(storage-area network):在拥有部分和所有SAN 存储的磁盘上运行 ,可以对单个磁盘、整个阵列测试
3)NAS(network-attached storage):测试数据文件在NAS上的性能。一般是决定于数据文件创建按或更新的i/o样式(patterns)
dba可以使用orion基于负载评估和比较不同的存储整理,决定网络连接数、存储整理、控制器等
2.步骤
1)为orion选择一个测试名(如mytest)
2)根据测试名创建orion输入文件(如mytest.lun)
输入文件中包含裸设备卷的列表或用于测试的文件列表,每个卷一行,不包含其他信息,如:
/dev/raw/raw1
/dev/raw/raw2
/dev/raw/raw3
/dev/raw/raw4
/dev/raw/raw5
/dev/raw/raw6
/dev/raw/raw7
/dev/raw/raw8
3)确认所有卷都放入输入文件了,使用dd命令查看,如:
dd if=/dev/raw/raw1 f=/dev/null bs=32k count=1024
4)确保平台上已经安装了必须的库来做异步i/o
orion测试的完成是以异步i/o为基础的,linux和solaris中libaio这个library是必须安装在lib目录下的
5)第一次orion测试,使用带有oltp或dss选项的run命令,如:
$ ./orion -run oltp
6)在类似于mytest_summary.txt的文件中查看结果
官方文档206、207页提供了一些相关参数和用法示例
具体用法需要试验来说明
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26451536/viewspace-752496/ ,如需转载,请注明出处,否则将追究法律责任。