ORACLE IO校准
What is the Orion I/O Test Tool? (Doc ID 1905698.1)
Oracle Orion is a tool for predicting the performance of an Oracle database without having to install Oracle or create a database. Unlike other I/O calibration tools, Oracle Orion is expressly designed for simulating Oracle database I/O workloads using the same I/O software stack as Oracle. Orion can also simulate the effect of striping performed by Oracle Automatic Storage Management.
数据库内部的I/O校准
摘抄于oracle官方文档
The I/O calibration feature of Oracle Database enables you to assess the performance of the storage subsystem, and determine whether I/O performance problems are caused by the database or the storage subsystem. Unlike other external I/O calibration tools that issue I/Os sequentially, the I/O calibration feature of Oracle Database issues I/Os randomly using Oracle data files to access the storage media, producing results that more closely match the actual performance of the database.
上面的内容大意是:
Oracle数据库的I/O校准特性使您能够评估存储子系统的性能,并确定I/O性能问题是由数据库还是存储子系统引起的。与其他依次发布I/O的外部I/O校准工具不同,Oracle数据库的I/O校准特性随机使用Oracle数据文件访问存储介质,产生的结果与数据库的实际性能更接近
I / O模型
在深入研究AIO API之前,让我们探索Linux下可用的不同I / O模型。这并不是要进行详尽的审查,而是旨在涵盖最常见的模型,以说明它们与异步I / O的区别。图1显示了同步和异步模型,以及阻塞和非阻塞模型。
图1.基本Linux I / O模型的简化矩阵
I/O校准的先决条件
在运行I/O校准之前,请确保满足以下要求:
-
必须授予用户
SYSDBA
特权 -
timed_statistics
必须设置为TRUE
-
必须启用异步I/O
在使用文件系统时,可以通过设置
FILESYSTEMIO_OPTIONS
初始化参数SETALL
. -
通过运行以下查询,确保为数据文件启用了异步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';
此外,一次只能对数据库实例执行一次校准。
How To Check if Asynchronous I/O is Working On Linux (Doc ID 237299.1)
cat /proc/slabinfo | grep kio
Since Oracle Linux provides different kernels (including RedHat Compatiable Kernel, Oracle UEK1/UEK2/UEK3), the output could be slightly different.
If Async I/O is enabled
运行I/O校准
使用DBMS_RESOURCE_MANAGER
.CALIBRATE_IO
程序。此过程向数据库文件发出I/O密集型只读工作负载(由1兆字节随机I/O组成),以确定存储子系统可支持的最大IOPS(每秒I/O请求)和Mbps(每秒I/O兆字节)。
I/O校准分两个步骤进行:
-
在I/O校准的第一步,使用
DBMS_RESOURCE_MANAGER
.CALIBRATE_IO
过程中,该过程向所有数据库实例中的所有数据文件发出随机数据库块大小的读取(默认为8KB).此步骤在输出参数中提供最大IOPS。max_iops
数据库所能维持的。价值max_iops
是OLTP数据库的一个重要指标。输出参数actual_latency
提供此工作负载的平均延迟时间。当需要特定的目标延迟时,可以使用输入参数指定目标延迟。max_latency
(指定数据库块大小IO请求的最大允许延迟(毫秒))。 -
第二步使用
DBMS_RESOURCE_MANAGER
.CALIBRATE_IO
过程随机发出问题,1MB从所有数据库实例读取所有数据文件。第二步产生输出参数。max_mbps
,它指定数据库可以维持的最大Mbps I/O。这一步为数据仓库提供了一个重要的度量标准。
如果用户提供num_physical_disks
输入参数,该参数指定数据库存储系统中物理磁盘的大致数目。
由于运行I/O工作负载的开销,I/O校准只应在数据库空闲时执行,或在非高峰时间执行,以尽量减少I/O工作负载对正常数据库工作负载的影响。
若要运行I/O校准和评估Oracle数据库使用的存储子系统的I/O能力,请使用DBMS_RESOURCE_MANAGER
.CALIBRATE_IO
程序:
select name,asynch_io from v$datafile f,v$iostat_file i
2 where f.file#=i.file_no and (filetype_name='Data File' or filetype_name='Temp File');
NAME ASYNCH_IO
-------------------------------------------------------------------------------- ---------
/u01/app/oracle/oradata/PROD/system01.dbf ASYNC_OFF
/u01/app/oracle/oradata/PROD/system01.dbf ASYNC_OFF
/u01/app/oracle/oradata/PROD/sysaux01.dbf ASYNC_OFF
/u01/app/oracle/oradata/PROD/undotbs01.dbf ASYNC_OFF
/u01/nolog01.dbf ASYNC_OFF
/u01/app/oracle/oradata/PROD/users01.dbf ASYNC_OFF
6 rows selected.
该情况是没有开启文件异步,开启步骤如下
alter system set filesystemio_options=setall scope=spfile;
修改后需要重启
select name,asynch_io from v$datafile f,v$iostat_file i
2 where f.file#=i.file_no and (filetype_name='Data File' or filetype_name='Temp File');
NAME ASYNCH_IO
---------------------------------------------------------------------------------------------------- ---------
/u01/app/oracle/oradata/PROD/system01.dbf ASYNC_ON
/u01/app/oracle/oradata/PROD/system01.dbf ASYNC_ON
/u01/app/oracle/oradata/PROD/sysaux01.dbf ASYNC_ON
/u01/app/oracle/oradata/PROD/undotbs01.dbf ASYNC_ON
/u01/nolog01.dbf ASYNC_ON
/u01/app/oracle/oradata/PROD/users01.dbf ASYNC_ON
IO校准并不是单独的列出功能,而是融入到Oracle的Resource Manager功能包里面。调用IO校准的功能包DBMS_RESOURCE_MANAGER.CALIBRATE_IO,
其中两个输入参数,一个是磁盘的个数 NUM_DISKS,另一个是允许的最大IO MAX_LATENCY延迟。
调用过程如下:
SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 100, 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(<NUM_DISKS>, <MAX_LATENCY>,iops, mbps, lat);
max_iops = 392
latency = 59
max_mbps = 1247
---执行过程中也可以通过V$IO_CALIBRATION_STATUS视图了解进度
SQL> select * from V$IO_CALIBRATION_STATUS;
STATUS CALIBRATION_TIME
------------- --------------------------------------------------------------------------------
IN PROGRESS 15-1月 -21 16.57.35.121 下午
--DBA_RSRC_IO_CALIBRATE 视图记录了IO CALIBRATION的历史信息
SQL> alter session set nls_timestamp_format='HH24:MI:SS';
Session altered
SQL> col start_time for a10;
SQL> col end_time for a10;
SQL> select * from DBA_RSRC_IO_CALIBRATE;
START_TIME END_TIME MAX_IOPS MAX_MBPS MAX_PMBPS LATENCY NUM_PHYSICAL_DISKS
---------- ---------- ---------- ---------- ---------- ---------- ------------------
16:55:29 17:02:00 392 42 59 15 2