暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle 使用calibrate_io简单测试io性能

张鹏 2024-02-04
1083

1971.Oracle 使用calibrate_io简单测试io性能
一般情况下使用orion进行oracle磁盘性能测试,也可以用DBMS_RESOURCE_MANAGER.calibrate_io简单测试一下
SET SERVEROUTPUT ON
DECLARE
l_latency PLS_INTEGER;
l_iops PLS_INTEGER;
l_mbps PLS_INTEGER;
BEGIN
DBMS_RESOURCE_MANAGER.calibrate_io (num_physical_disks => 1,
max_latency => 20,
max_iops => l_iops,
max_mbps => l_mbps,
actual_latency => l_latency);
DBMS_OUTPUT.put_line('Max IOPS = ’ || l_iops);
DBMS_OUTPUT.put_line('Max MBPS = ’ || l_mbps);
DBMS_OUTPUT.put_line('Latency = ’ || l_latency);
END;
/
Oracle I/O性能测试之DBMS_RESOURCE_MANAGER.CALIBRATE_IO篇(持续更新中)
简介####
Oracle 11g数据库中提供了DBMS_RESOURCE_MANAGER.CALIBRATE_IO PL/SQL过程用于对当前数据库实例的I/O性能进行测试。
DBMS_RESOURCE_MANAGER.CALIBRATE_IO的参数如下:
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (
num_physical_disks IN PLS_INTEGER DEFAULT 1,
max_latency IN PLS_INTEGER DEFAULT 20,
max_iops OUT PLS_INTEGER,
max_mbps OUT PLS_INTEGER,
actual_latency OUT PLS_INTEGER);
可以使用如下方法进行调用测试:
SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
– DBMS_RESOURCE_MANAGER.CALIBRATE_IO (, <MAX_LATENCY>, iops, mbps, lat);
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;
/
其中num_physical_disks参数根据当前系统中的disk个数进行设置,在虚拟环境中,可能要选取不同的数值进行测试比较,以获得最佳测试效果。
测试实例####
以下为在虚拟机中的oracle rdbms 11.2.0.4测试的情况,分别选取num_physical_disks为1、2、3、4进行比较。
测试成绩如下:
num_physical_disks=1#####
max_iops = 118
latency = 10
max_mbps = 12
num_physical_disks=2#####
max_iops = 126
latency = 9
max_mbps = 16
num_physical_disks=3#####
max_iops = 110
latency = 11
max_mbps = 16
num_physical_disks=4#####
max_iops = 102
latency = 12
max_mbps = 14
可以看出,在我当前环境中,当num_physical_disks=2,测试可以获取最佳的I/O性能。
和Oracle Orion比较####
和Oracle orion工具相比,使用DBMS_RESOURCE_MANAGER.CALIBRATE_IO方法进行I/O性能测试,是在真实的oracle实例环境中测试,相对Oracle orion使用程序模拟Oracle的I/O操作更能反映真实情况。
但是DBMS_RESOURCE_MANAGER.CALIBRATE_IO需要首先有Oracle 实例存在,而且测试结果和控制参数过于简单,不便于根据真实系统进行调整。而Oracle orion有比较多的控制参数,可以用来在实施数据库之前对I/O子系统性能进行评估。
一些研究####
async IO?#####
把Oracle orion和DBMS_RESOURCE_MANAGER.CALIBRATE_IO两种方法测试出来的性能进行比较,发现DBMS_RESOURCE_MANAGER.CALIBRATE_IO的测试结果要远远低于Oracle orion。
看了一下文档,发现dbf的async IO没开。
使用alter system set filesystemio_options=‘asynch’ scope=spfile打开async IO,然后重启数据库实例。
重新运行测试,结果如下:
max_iops = 120
latency = 98
max_mbps = 18
(这个结果和没开async IO差别不大啊),还得继续研究。
ORACLE数据库优化-存储IO性能校准
通过数据库评估存储设备IO性能-Oracle 11g IO校准功能介绍
---------Oracle11g IO校准功能介绍
实战案例,19.5版本RAC asm存储性能检测
###查询数据文件是否支持异步IO#####
COL NAME FORMAT A50
SELECT NAME,ASYNCH_IO FROM VDATAFILEF,VDATAFILE F,VIOSTAT_FILE I
WHERE F.FILE#=I.FILE_NO
AND FILETYPE_NAME=‘Data File’;
########进行IO校准#######
SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
–DBMS_RESOURCE_MANAGER.CALIBRATE_IO (, <MAX_LATENCY>, iops,mbps, lat);
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (10, 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;
/
######################执行IO校准时报错信息如下############
报错信息如下:
2019-12-14T14:25:33.896235+08:00
Errors in file /u01/app/oracle/diag/rdbms/monidb/monidb1/trace/monidb1_cscm_154498.trc:
ORA-00448: normal completion of background process
ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O
Linux-x86_64 Error: 11: Resource temporarily unavailable
Additional information: 3
Additional information: 128
Additional information: 80551681480
ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O
Linux-x86_64 Error: 11: Resource temporarily unavailable
Additional information: 3
Additional information: 128
3、故障解决
#依据ORA-27090: MESSAGE 27090 NOT FOUND; (文档 ID 579108.1)文档。我们改动内核參数fs.aio-max-nr
#因为此数据库为RAC环境下,因此同一时候调整了2个节点,以下为调整后的情形。
suse11a:~ # grep max-nr /etc/sysctl.conf
#fs.aio-max-nr = 1048576
fs.aio-max-nr = 3145728
suse11b:~ # grep max-nr /etc/sysctl.conf
#aio-max-nr = 1048576
fs.aio-max-nr = 3145728

sysctl -p

#配置完成后能够通过cluvy校验
#几日后观察alert日志,未发现该类错误。
Check: Kernel parameter for “aio-max-nr”
Node Name Current Configured Required Status Comment


suse11a 3145728 3145728 1048576 passed
suse11b 3145728 3145728 1048576 passed
Result: Kernel parameter check passed for “aio-max-nr”
proc 文件系统包含了两个虚拟文件,它们可以用来对异步 I/O 的性能进行优化:
/proc/sys/fs/aio-nr 文件提供了系统范围异步 I/O 请求现在的数目。
/proc/sys/fs/aio-max-nr 文件是所允许的并发请求的最大个数
在一个程序中如果涉及到磁盘的IO操作时,有两种情况

  1. 程序等待IO操作完成,CPU再接下来处理程序的其他部分(等待IO的时间段内,CPU处于Idle Waiting状态)。
  2. 程序不等待IO操作完成,允许CPU处理接下来的其他任务(或者理解为允许CPU处理接下来的不依赖于IO完成的任务)。
    显然,第一种情况,CPU的资源白白的浪费了,也就是同步IO。第二种情况更有利于CPU的充分利用,这就是异步IO(asynchronous IO)
    我们知道aio-nr是所有当前活动的异步IO进程上下文的总和,其值最多不能超过aio-max-nr的设定值。
    并且数据库是在机房意外断电的情况下突然关闭的,关闭的一瞬间有大量的事务正在运行,
    所以重新启动的时候必然有大量的回滚与已提交但没有写入到数据文件的数据要开始写入,这时候的IO量是非常大的,由于启用了异步IO,此时大量的上下文切换达到了操作系统设定的最大值,
    于是oracle就停止响应了。查询metalink了解到oracle已证实这是一个BUG,官方建议fs.aio-max-nr的值设置为1M或以上可以解决此问题。
    解决办法:
    echo “fs.aio-max-nr = 3145728” >> /etc/sysctl.conf
    重启oracle服务
    set lines 120
    col CALIBRATION_TIME for a30
    select * From viocalibrationstatus;SQL>Vio_calibration_status; SQL> VIOSTAT_FUNCTION
    set lines 120
    col name for a30
    select name,phyrds,phywrts from vfilestata,vfilestat a,vdatafile b where a.file#=b.file# order by phyrds desc fetch limit 10;
    [oracle@rac02 ~]$ sqlplus / as sysdba
    SQL*Plus: Release 19.0.0.0.0 - Production on Sat Dec 14 15:02:20 2019
    Version 19.5.0.0.0
    Copyright © 1982, 2019, Oracle. All rights reserved.
    Connected to:
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.5.0.0.0
    SQL> SET SERVEROUTPUT ON
    SQL> DECLARE
    2 lat INTEGER;
    3 iops INTEGER;
    4 mbps INTEGER;
    5 BEGIN
    DBMS_RESOURCE_MANAGER.CALIBRATE_IO (, <MAX_LATENCY>, iops,mbps, lat);
    DBMS_RESOURCE_MANAGER.CALIBRATE_IO (10, 10,iops, mbps, lat);
    DBMS_OUTPUT.PUT_LINE ('max_iops = ’ || iops);
    DBMS_OUTPUT.PUT_LINE ('latency = ’ || lat);
    dbms_output.put_line('max_mbps = ’ || mbps);
    10 11 end;
    / 12
    max_iops = 54217
    latency = 29.579
    max_mbps = 1418
    max_iops = 54217
    latency = 30
    max_mbps = 1418
    PL/SQL procedure successfully completed.
    SQL> select MAX_IOPS,MAX_MBPS,MAX_PMBPS,LATENCY from DBA_RSRC_IO_CALIBRATE;
    MAX_IOPS MAX_MBPS MAX_PMBPS LATENCY

 54217       1418        457     29.579

SQL>
SQL> SQL> SQL> SQL> SQL> SQL>
最后在DBA_RSRC_IO_CALIBRATE视图中,可以查询到本次IO校准的各个性能指标值如下,
本次测试的存储性能,
每秒持续读取数据块请求的最大数量(max_iops)为60,
每秒最大可读取(max_mbps)为43mbps,
单个进程每秒最大可读取(max_pmbps)为39mbps,
读取数据块请求出现有16次延迟

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论