今天是2014-04-21,今天简单只说明一下怎么影响重做数据的一个因素,那就是i/o吞吐量,oracle的介质恢复依赖于i/o,如果i/o存在瓶颈,那么势必会影响备库的介质恢复。 那么i/o stack包含hbas,存储相关的交换机、存储物理磁盘。那么oracle建议在应用程序部署的时候,建议去验证i/o避免存在问题。但是之前有一个很刺手的问题,那就是如何去验证i/o侧吞吐量,换句话说怎么去验证i/o吞吐量更符合真实的生产环境。 In Oracle Database 11g, the Real Application Testing feature (Capture/Replay) was introduced to inject real (captured) workload into the system. However, another new 11g feature is available to help assess the I/O capability of the database's storage system, and gauge maximum IOPS and Mbytes/s. capability i/o feature 是依据一个数据库内部的函数(dbms_resource_manager.calibrateio()),该函数是oracle database内部集成的,更能满足测试i/o问题,且在最后将输出相关报告信息。 那么执行这个包需要注意什么呢? 1、权限,必须具有sysdba执行该过程的权限,另外需要打开timed_statistics。 2、确定异步i/o在数据库的所有数据文件和临时文件都已经得到应用启动,我们可以通过v$datafile 和v$iostat_file视图关联进行、确认。 eg: col name format a50 如果异步i/o没有启动,设置disk_asynch_io=true启动该功能,但默认是开启的,如果在linux中最大slots使用完毕,那么将自动关闭噶 功能,这也就是为什么虽然设置了disk_asynch_io=true了却依然没有达到效果。最大的slots可以查看/proc/sys/fs/aio-max-nr 当前使用的可以查看/proc/sys/fs/aio-nr去分别确认。 3、确保服务器只有需要测试的数据库开启,避免 其他应用软件的影响。 4、对于RAC,需要确保所有的实例都开启,因为 将会对所有节点做全面的校对,执行该过程只需在一个实例即可。 5、确保只有一个用户执行一个校对i/o的操作。可以通过v$io_calibration_status查看当前鉴定状态。 另外查看资料了解到有这么几个过程: The calibration will run in different phases. In the first phase, small block random I/O 一旦执行完毕,其结果将存在于dba_rsrc_io_calibrate表中。 好了。 了解到这些,下面开始去实验操作。让实践得真知。 语法如下: SET SERVEROUTPUT ON Parameter Description 环境为oracle linux 6.4 +database 11.2.0.4(RAC 2节点 )+asm 11.2.0.4 对了,另外如果数据库使用的是asm,那么如果验证的死数据文件需要使用datadg中的所有物理磁盘,而不是fra中的物理磁盘。虽然我使用存储化的lun进行的映射,但是 num_physical_disks必须是真实物理磁盘个数,因为是测试是一个磁盘,那么这个参数为1。 1、验证是否启动async i/o [oracle@rac-one ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Apr 21 22:35:23 2014 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SQL> show parameter disk_asynch_io(查看数据库是否启用了异步i/o) NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ disk_asynch_io boolean TRUE SQL> ! [oracle@rac-one ~]$ more /proc/sys/fs/aio-max-nr (系统slots最大数量) 1048576 [oracle@rac-one ~]$ more /proc/sys/fs/aio-nr (当前使用的slots) 23680 [oracle@rac-one ~]$ exit exit SQL> col name for a50 SQL> set linesize 200 SQL> select name,asynch_io from v$datafile f,v$iostat_file i where f.file#=i.file_no and (filetype_name='Data File' or filetype_name='Temp File'); -------------(查看启用了async的文件信息) NAME ASYNCH_IO -------------------------------------------------- --------- +DATADG/rac/datafile/system.262.839537769 ASYNC_ON +DATADG/rac/datafile/system.262.839537769 ASYNC_ON +DATADG/rac/datafile/sysaux.263.839537911 ASYNC_ON +DATADG/rac/datafile/undotbs1.264.839538031 ASYNC_ON +DATADG/rac/datafile/undotbs2.266.839538155 ASYNC_ON +DATADG/rac/datafile/users.267.839538199 ASYNC_ON 6 rows selected. SQL> 开始验证i/o: SQL> set serveroutput on SQL> declare 2 lat integer; 3 iops integer; 4 mbps integer; 5 begin 6 --dbms_resource_manager.calibrate_io(<num_disks>,<max_latency>,iops,mbps,lat); 7 dbms_resource_manager.calibrate_io(1,10,iops,mbps,lat); 8 dbms_output.put_line('max_iops=' || iops); 9 dbms_output.put_line('latency=' || lat); 10 dbms_output.put_line('max_mbps=' || mbps); 11 end; 12 / 查看状态信息: SQL> select * from v$io_calibration_status; STATUS CALIBRATION_TIME ------------- --------------------------------------------------------------------------- IN PROGRESS SQL> select file_no,small_read_megabytes,small_read_reqs,large_read_megabytes,large_read_reqs from v$iostat_file; FILE_NO SMALL_READ_MEGABYTES SMALL_READ_REQS LARGE_READ_MEGABYTES LARGE_READ_REQS ---------- -------------------- --------------- -------------------- --------------- 0 0 24 0 0 0 107 6819 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 40 4808 884 901 FILE_NO SMALL_READ_MEGABYTES SMALL_READ_REQS LARGE_READ_MEGABYTES LARGE_READ_REQS ---------- -------------------- --------------- -------------------- --------------- 1 0 4 0 0 2 28 2515 777 779 3 5 577 351 351 4 3 404 264 264 可知正在进行测试中: 执行结束将输出结果如下: SQL> declare 2 lat integer; 3 iops integer; 4 mbps integer; 5 begin 6 --dbms_resource_manager.calibrate_io(<num_disks>,<max_latency>,iops,mbps,lat); 7 dbms_resource_manager.calibrate_io(1,10,iops,mbps,lat); 8 dbms_output.put_line('max_iops=' || iops); 9 dbms_output.put_line('latency=' || lat); 10 dbms_output.put_line('max_mbps=' || mbps); 11 end; 12 / max_iops=45 latency=42 max_mbps=12 PL/SQL procedure successfully completed. SQL> 可以知道这两个节点请求小块读为45,最大吞吐量为12M/s。虚拟机就是卡的掉渣。 |