I / O子系统是Oracle数据库的重要组成部分。 本章介绍基本的I / O概念,讨论数据库不同部分的I / O需求,并提供I / O子系统设计的示例配置。
本章包括以下主题:
■关于I / O
■I / O配置
■数据库内的I / O校准
■使用Oracle Orion校准工具进行I / O校准
关于I / O
每个Oracle数据库读取或写入磁盘上的数据,数据库都会生成磁盘I / O。许多软件应用程序的性能本质上受到磁盘I / O的限制。花费大部分CPU时间等待I / O活动完成的应用程序被称为I / O限制。
Oracle数据库的设计使得如果应用程序写得很好,其性能不应受I / O限制。如果I / O系统以接近容量运行并且无法在可接受的时间内处理I / O请求,则调整I / O可以提高应用程序的性能。但是,如果应用程序不是I / O限制的(例如,CPU是限制因素),调整I / O将无助于性能。
设计I / O系统时请考虑以下数据库要求:
■存储,如最小磁盘容量
■可用性,例如连续(24 x 7)或工作时间
■性能,如I / O吞吐量和应用程序响应时间
许多I / O设计计划存储和可用性要求,假设性能不会成为问题。这并非总是如此。理想情况下,要配置的磁盘和控制器的数量应由I / O吞吐量和冗余要求决定。磁盘的大小可以由存储要求决定。
在开发I / O设计计划时,请考虑使用Oracle自动存储管理(Oracle ASM)。 Oracle ASM是一个集成的高性能数据库文件系统和磁盘管理器,它基于数据库应该管理存储而不需要管理员执行此操作的原则。
Oracle建议您将Oracle ASM用于数据库文件存储,而不是原始设备或操作系统文件系统。 Oracle ASM提供了以下主要优势:
■ Striping 条带化
■ Mirroring 镜像
■ Online storage reconfiguration and dynamic rebalancing 在线存储重新配置和动态重新平衡
■ Managed file creation and deletion 管理文件的创建和删除
I/O Configuration
本节介绍在定义系统的I / O配置时要收集的基本信息和决策。 您希望保持配置尽可能简单,同时保持所需的可用性,可恢复性和性能。 配置越复杂,管理,维护和调整越困难。
本节包含以下主题:
■ Lay Out the Files Using Operating System or Hardware Striping 使用操作系统或硬件分条布置文件
■ Manually Distributing I/O 手动分配I / O
■ When to Separate Files 何时分离文件
■ Three Sample Configurations 三个示例配置
■ Oracle Managed Files Oracle托管文件
■ Choosing Data Block Size 选择数据块大小
Lay Out the Files Using Operating System or Hardware Striping
如果您的操作系统具有LVM软件或基于硬件的条带化,则可以使用这些工具分配I / O。 使用LVM或硬件条带时要做出的决定包括条纹深度和条纹宽度。
■条纹深度是条纹的大小,有时称为条纹单位。
■条纹宽度是条纹深度与条纹集中驱动器数量的乘积。
明智地选择这些值,以便系统能够维持所需的吞吐量。 对于Oracle数据库,合理的条带深度范围从256 KB到1 MB。 不同类型的应用程序受益于不同的条纹深度。 最佳条纹深度和条纹宽度取决于以下几点:
■请求的I / O大小
■I / O请求的并发性
■物理条纹边界与块大小边界的对齐
■建议系统的可管理性
请求的I / O大小
表8-1列出了可用于设置I / O大小的Oracle数据库和操作系统参数:
除了I / O大小外,并发度还有助于确定理想的条带深度。选择条纹宽度和条纹深度时请考虑以下事项:
■在低并发(顺序)系统上,确保没有单个I / O访问同一磁盘两次。例如,假设条带宽度是四个磁盘,条带深度是32K。如果Oracle服务器进程发出单个1MB I / O请求(例如,对于全表扫描),则条带中的每个磁盘必须执行8个I / O以返回请求的数据。为了避免这种情况,平均I / O的大小应该小于条带宽度乘以条带深度。如果不是这样,则Oracle数据库向操作系统发出的单个I / O请求会导致对同一磁盘的多个物理I / O请求。
■在高并发(随机)系统上,确保没有单个I / O请求分解为多个物理I / O调用。如果不这样做,则会增加系统中执行的物理I / O请求的数量,进而严重降低I / O响应时间。
I / O请求的并发性
在具有高度并发小I / O请求的系统中,例如在传统的OLTP环境中,保持较大的条带深度是有益的。使用大于I / O大小的条纹深度称为粗粒条纹。在高并发性系统中,条带深度可以如下,其中n> 1:
n * DB_BLOCK_SIZE
粗粒条纹允许阵列中的磁盘服务于多个I / O请求。通过这种方式,大量的并发I / O请求可以通过一组条带化磁盘进行服务,并且I / O设置成本最低。粗粒度条带化努力使整个I / O吞吐量最大化。与全表扫描一样,多块读取将在分条深度很大并且可以从一个驱动器提供服务时受益。数据仓库环境中的并行查询也是粗粒度条带化的候选对象,因为许多单独的进程分别发出不同的I / O。如果在没有高并发请求的系统中使用粗颗粒条带,则可能导致热点。
在传统DSS环境或低并发OLTP系统中有少量大I / O请求的系统中,保持较小的条带深度是有益的。这被称为细粒条纹。在这样的系统中,条带深度如下所示,其中n小于多块读取参数,例如DB_FILE_MULTIBLOCK_READ_COUNT:
n * DB_BLOCK_SIZE
细粒度条带化允许单个I / O请求由多个磁盘提供服务。细粒度条带化致力于最大限度地提高单个I / O请求或响应时间的性能。
物理条纹边界与块大小边界的对齐
在某些Oracle数据库端口上,数据库块边界可能不与条带对齐。如果条带深度与数据库块的大小相同,则Oracle数据库发出的单个I / O可能会导致两个物理I / O操作。
这在OLTP环境中不是最佳的。为确保一个逻辑I / O的可能性更高,导致不超过一个物理I / O,最小条带深度至少应为Oracle块大小的两倍。表8-2显示了随机访问和顺序读取的推荐最小条带深度。
随机读取和写入 最小条带深度是Oracle块大小的两倍。
连续读取 最小条带深度是DB_FILE_MULTIBLOCK_READ_COUNT值的两倍 , * 乘以Oracle块大小。
建议系统的可管理性
使用LVM,要管理的最简单的配置是在所有可用磁盘上使用单个条带卷。在这种情况下,条带宽度包含所有可用的磁盘。所有数据库文件驻留在该卷内,均匀有效地分配负载。这种单卷布局在大多数情况下提供了足够的性能。
只有与容许可恢复性的RAID技术(例如RAID 1)结合使用时,单卷配置才可行。否则,丢失单个磁盘意味着同时丢失所有文件,因此会执行完整的数据库恢复和恢复。
除了性能之外,还有一个可管理性问题:系统的设计必须允许简单添加磁盘以允许数据库增长。挑战是如何做到这一点,同时保持负载均衡。
例如,初始配置可能涉及在64个磁盘上创建单个条带卷,每个磁盘为16 GB。这是主数据总容量为1 TB(TB)的磁盘空间。在系统运行后的某个时候,为了将来的数据库增长,必须添加额外的80 GB(即五个磁盘)。
将该空间用于数据库的选项包括创建包含五个新磁盘的第二个卷。但是,如果这些新磁盘无法维持放置在其上的文件所需的I / O吞吐量,则可能会出现I / O瓶颈。
另一种选择是增加原始音量的大小。 LVM正变得足够复杂以允许动态重新配置条带宽度,这允许在系统处于联机状态时添加磁盘。这开始使生产环境中的单个条带卷上的所有文件都可行。如果您的LVM无法支持将磁盘动态添加到条带,那么您可能需要选择更小,更易于管理的条带宽度。然后,当添加新磁盘时,系统可以增加一个条带宽度。
在前面的例子中,八个磁盘可能是一个更易于管理的条带宽度。这只有在8个磁盘每秒能够支持所需数量的I / O的情况下才可行。因此,当需要额外的磁盘空间时,可以添加另一个八磁盘条带,从而保持卷间的I / O平衡。
注意:
条带宽度越小,您将需要花费时间在卷上分发文件的可能性越大,并且程序越接近手动分发I / O。
Manually Distributing I/O
如果您的系统没有LVM或硬件条带,则必须通过根据每个文件的I / O要求分发文件,在可用磁盘上手动平衡I / O。为了决定文件放置,您应该熟悉数据库文件的I / O要求和I / O系统的功能。如果您对这些数据不熟悉并且没有代表性的工作负载进行分析,则可以先进行猜测,然后在使用情况变得已知时调整布局。
要手动分割磁盘,您需要将文件的存储要求与其I / O要求相关联。
1.通过检查文件和磁盘的大小来评估数据库磁盘存储要求。
2.为每个文件确定预期的I / O吞吐量。确定哪些文件具有最高的I / O速率,哪些文件没有很多I / O。将文件放在所有可用的磁盘上,以平衡I / O速率。
一种常用的手动I / O分配方法建议将常用表与其索引分开。这是不正确的。在事务过程中,首先读取索引,然后读取表。由于这些I / O按顺序发生,因此可以将表和索引存储在同一个磁盘上,而不存在争用。仅仅因为数据文件包含索引或表数据而不能分离数据文件。只有当该文件的I / O速率影响数据库性能时,才应该决定是否分离文件。
When to Separate Files
无论您使用操作系统条带化还是手动I / O分发,
如果I / O系统或I / O布局不能支持所需的I / O速率,则需要将剩余文件中具有较高I / O速率的文件分开。 您可以在计划阶段或系统运行后识别这些文件。
分离文件的决定只能由I / O率,可恢复性问题或可管理性问题推动。 (例如,如果您的LVM不支持动态重新配置条带宽度,那么您可能需要创建较小的条带宽度,以便一次添加n个磁盘以创建一个具有相同配置的新条带。)
在分离文件之前,请确认瓶颈确实是I / O问题。 从调查瓶颈产生的数据确定哪些文件具有最高的I / O率。
以下各节介绍如何分隔以下文件类型:
■表,索引和TEMP表空间
■重做日志文件
■归档重做日志
表,索引和TEMP表空间
如果具有高I / O的文件是属于包含表和索引的表空间的数据文件,则通过调整SQL或应用程序代码来确定是否可以减少这些文件的I / O。
如果具有高I / O的文件是属于TEMP表空间的数据文件,则调查是否调整执行磁盘排序的SQL语句以避免此活动或调整排序。
在对应用程序进行了调整以避免不必要的I / O之后,如果I / O布局仍不能维持所需的吞吐量,请考虑分离高I / O文件。
重做日志文件 Redo Log Files
如果高I / O文件是重做日志文件,则考虑将重做日志文件与其他文件分开。可能的配置可能包括以下内容:
■将所有重做日志放在一个磁盘上,而不使用任何其他文件。还要考虑可用性;出于可恢复性目的,同一组的成员应该位于不同的物理磁盘和控制器上。
■将每个重做日志组放置在不存储任何其他文件的单独磁盘上。
■使用操作系统分条工具将重做日志文件划分到多个磁盘上。 (在这种情况下无法手动分条。)
■避免将RAID 5用于重做日志。
重做日志文件由日志写入器(LGWR)进程顺序写入。如果在同一磁盘上没有并行活动,则可以使此操作更快。专用单独的磁盘重做日志文件通常可确保LGWR平稳运行,无需进一步调整。如果您的系统支持异步I / O,但此功能当前未配置,请测试以查看使用此功能是否有益。与LGWR相关的性能瓶颈很少见。
归档重做日志 Archived Redo Logs
如果存档器速度较慢,那么通过确保存档器读取和LGWR写入分开来防止存档器进程与LGWR之间的I / O争用可能是谨慎的。这是通过在交替驱动器上放置日志来实现的。
例如,假设一个系统有四个重做日志组,每个组有两个成员。要创建单独的磁盘访问,八个日志文件应该标记为1a,1b,2a,2b,3a,3b,4a和4b。这需要至少四个磁盘,另外一个磁盘用于归档文件。
图8-1说明了如何在磁盘之间分配重做成员以最大限度地减少争用。
在本例中,LGWR切换出日志组1(成员1a和1b)并写入日志组2(2a和2b)。 同时,存档器进程从组1读取并写入其归档目标。 请注意重做日志文件如何与争用隔离。
注意:
镜像重做日志文件或将每个重做日志文件的多个副本保留在单独的磁盘上,不会显着减慢LGWR的速度。 LGWR并行写入每个磁盘,并等待并行写入的每个部分完成。 因此,并行写入所花费的时间不会超过最长可能的单磁盘写入时间。
由于重做日志是以串行方式写入的,因此专用于重做日志活动的驱动器通常需要有限的磁头移动。 这显着加速了日志写入。
Three Sample Configurations
本节包含三个配置I / O系统的高级示例。这些示例包括用于定义磁盘拓扑,条带深度等的示例计算:
■为每个磁盘分割一切
■将归档日志移动到不同的磁盘
■移动重做日志以分离磁盘
为每个磁盘划分一切
最简单的I / O配置方法是构建一个跨越所有可用磁盘的巨大卷。为了说明可恢复性,卷将被镜像(RAID 1)。每个磁盘的分条单元应该大于频繁I / O操作的最大I / O大小。这为大多数情况提供了足够的性能。
将归档日志移动到不同的磁盘
如果归档重做日志文件与其他文件在同一组磁盘上分区,那么当数据库归档重做日志时,这些磁盘上的任何I / O请求都可能受到影响。将归档重做日志文件移动到单独的磁盘中会带来以下好处:
■档案可以高速执行(使用顺序I / O)。
■其他任何内容都不受存档目标磁盘上降级的响应时间的影响。
存档日志的磁盘数由存档日志生成的速率和所需的存档存储量决定。
将重做日志移动到单独的磁盘
在高度更新的OLTP系统中,重做日志是写入密集型的。将重做日志文件移至独立于其他磁盘和归档重做日志文件的磁盘具有以下优点:
■以尽可能高的速度执行写入重做日志。因此,事务处理性能处于最佳状态。
■重做日志的写入不会受到任何其他I / O的影响。
重做日志的磁盘数量主要取决于重做日志大小,与当前的技术磁盘大小相比,重做日志大小通常较小。通常,具有两个磁盘(可能镜像到四个磁盘以实现容错)的配置已足够。尤其是,通过在两个磁盘上交替使用重做日志文件,将重做日志信息写入一个文件不会影响读取完成的重做日志以进行归档。
Oracle Managed Files
当文件系统可以包含所有Oracle数据库数据时,使用Oracle托管文件可以简化数据库管理。 Oracle Database内部使用标准文件系统接口来根据表空间,临时文件,联机日志和控制文件的需要创建和删除文件。管理员只能指定要用于特定类型文件的文件系统目录。您可以为数据文件指定一个默认位置,并为控制和联机重做日志文件指定多达五个复用位置。
Oracle数据库确保创建一个唯一文件,并在不再需要时删除它。这可以减少管理员指定错误文件导致的损坏,减少废弃文件浪费的磁盘空间,并简化测试和开发数据库的创建。它还使便携式第三方工具的开发更容易,因为它消除了将操作系统特定的文件名放入SQL脚本中的需要。
可以将新文件创建为Oracle托管文件,而旧文件则以旧方式进行管理。因此,数据库可以混合使用Oracle托管文件和用户管理的文件。
Note:
Oracle Managed Files cannot be used with raw devices.
调整Oracle Managed Files时应考虑以下几点:
■由于Oracle托管文件需要使用文件系统,因此DBA会放弃对数据布局的控制。因此,正确配置文件系统很重要。
■在支持分条的LVM之上为Oracle管理文件构建文件系统。为了实现负载平衡和提高吞吐量,请对文件系统中的磁盘进行分条。
■如果在支持动态可扩展逻辑卷的LVM上使用Oracle管理文件,则效果最佳。否则,配置逻辑卷尽可能大。
■如果文件系统提供大型可扩展文件,Oracle托管文件效果最佳。
选择数据块大小
大多数系统的块大小为8 KB。 但是,OLTP系统偶尔会使用较小的块大小,而DSS系统偶尔会使用较大的块大小。 本节讨论在选择数据库块大小以获得最佳性能时的注意事项,并包含以下主题:
■读
■写
■块大小的优点和缺点
注意:
由于可管理性问题,不鼓励在单个数据库实例中使用多个块大小。
读
无论数据的大小如何,目标都是尽量减少检索所需数据所需的读取次数。
■如果行很小并且访问主要是随机的,那么选择一个更小的块大小。
■如果行很小并且访问主要是连续的,则选择较大的块大小。
■如果行很小并且访问既是随机又是顺序的,那么选择更大的块大小可能会很有效。
■如果行很大,例如包含大对象(LOB)数据的行,则选择较大的块大小。
写
对于高并发OLTP系统,当使用较大的块大小时,请考虑INITRANS,MAXTRANS和FREELISTS的适当值。这些参数会影响块中允许的更新并发度。但是,使用自动段空间管理时,您不需要为FREELISTS指定值。
如果您不确定要选择哪个块大小,那么对大多数处理大量事务的系统尝试使用8 KB的数据库块大小。这是一个很好的折衷方案,通常很有效。只有处理LOB数据的系统需要超过8 KB。
块尺寸的优点和缺点
表8-3列出了不同块大小的优缺点。
I/O Calibration Inside the Database
Oracle数据库的I / O校准功能使您能够评估存储子系统的性能,并确定I / O性能问题是由数据库还是存储子系统引起的。与依次发布I / O的其他外部I / O校准工具不同,Oracle数据库的I / O校准功能随机使用Oracle数据文件访问存储介质来发布I / O,产生更接近实际性能的结果数据库。
本节介绍如何使用Oracle数据库的I / O校准功能,并包含以下主题:
■I / O校准的先决条件
■运行I / O校准
Oracle数据库还提供Orion,一种I / O校准工具。 Orion是一种预测Oracle数据库性能的工具,无需安装Oracle或创建数据库。与其他I / O校准工具不同,Oracle Orion专门用于使用与Oracle相同的I / O软件堆栈来模拟Oracle数据库I / O工作负载。 Orion还可以模拟Oracle自动存储管理所执行的分条效果。有关更多信息,请参阅第8-12页的“使用Oracle Orion校准工具进行I / O校准”。
I / O校准的先决条件
在运行I / O校准之前,请确保满足以下要求:
■用户必须被授予SYSDBA权限
■timed_statistics必须设置为TRUE
■必须启用异步I / O
在使用文件系统时,可以通过将FILESYSTEMIO_OPTIONS初始化参数设置为SETALL来启用异步I / O。
■通过运行以下查询确保为数据文件启用了异步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';
此外,一次只能对数据库实例执行一次校准。
Running I/O Calibration
使用DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程访问Oracle数据库的I / O校准功能。此过程向数据库文件发出I / O密集型只读工作负载(由1兆字节的随机I / O组成),以确定最大IOPS(每秒I / O请求)和MBPS(兆字节I / O每秒),可以由存储子系统维持。
I / O校准分两步进行:
■在使用DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程进行I / O校准的第一步中,该过程默认情况下向所有数据库实例的所有数据文件发出随机数据库块大小的读取8 KB。此步骤提供数据库可以承受的输出参数max_iops中的最大IOPS。值max_iops是OLTP数据库的重要指标。输出参数actual_latency为此工作负载提供平均延迟。当您需要特定的目标延迟时,可以使用输入参数max_latency指定目标延迟(指定数据库块大小IO请求的最大可容忍延迟时间(以毫秒为单位)。
■使用DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程进行校准的第二步随机发出,1 MB将读取所有数据库实例中的所有数据文件。第二步产生输出参数max_mbps,它指定数据库可以承受的I / O的最大MBPS。这一步为数据仓库提供了一个重要的指标。
如果用户提供num_physical_disks输入参数(指定数据库存储系统中物理磁盘的大致数量),则校准运行更有效。
由于运行I / O工作负载的开销,只有在数据库处于空闲状态或在非高峰时段才应执行I / O校准,以最大限度地减少I / O工作负载对正常数据库工作负载的影响。
要运行I / O校准并评估Oracle数据库使用的存储子系统的I / O功能,请使用DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程:
SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
-- DBMS_RESOURCE_MANAGER.CALIBRATE_IO (, , iops, mbps, lat);
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 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;
/
运行DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程时,请考虑以下事项:
■一次只能在使用相同存储子系统的数据库上运行一次校准。如果您同时在使用相同存储子系统的单独数据库上运行校准,则校准将失败。
停顿数据库以最小化实例上的I / O。
■对于Oracle Real Application Clusters(Oracle RAC)配置,确保打开所有实例以跨节点校准存储子系统。
■对于Oracle Real Application Clusters(Oracle RAC)数据库,同时从所有实例生成工作负载。
■num_physical_disks输入参数是可选的。通过将num_physical_disks参数设置为数据库存储系统中物理磁盘的近似数量,校准可以更快更准确。
■在某些情况下,数据文件允许使用异步I / O,但用于提交异步I / O的 I / O子系统可能会最大化,并且I / O校准无法继续。在这种情况下,请参阅端口特定文档以获取有关检查系统上异步I / O的最大限制的信息。
在I / O校准过程中的任何时候,您都可以在V $ IO_CALIBRATION_STATUS视图中查询校准状态。 I / O校准成功完成后,您可以在DBA_RSRC_IO_CALIBRATE表中查看结果。