ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle在Solaris的VXFS上的异步IO问题

Oracle在Solaris的VXFS上的异步IO问题

原创 Linux操作系统 作者:coolyl 时间:2019-06-09 16:03:06 0 删除 编辑
Oraclevxfs上的异步IO问题一直不是很明白,因为公司使用的OS都是solaris系统,Oracle中究竟该不该使用异步IO成为争论的焦点,最近因为公司的一起事故,让我不得不去研究这个,查阅了一些文档,也有一些体会,跟大家分享一下。


Oraclevxfs上的异步IO问题一直不是很明白,因为公司使用的OS都是solaris系统,Oracle中究竟该不该使用异步IO成为争论的焦点,最近因为公司的一起事故,让我不得不去研究这个,查阅了一些文档,也有一些体会,跟大家分享一下。

   Solaris上首先查看一下哪些磁盘是vxfs格式的,使用命令:

Df -F vxfs

/opt/oracle/db02   (/dev/vx/dsk/ipasdg/db02_vol):55665072 blocks   869766 files

/opt/oracle/db03   (/dev/vx/dsk/ipasdg/db03_vol):41688928 blocks   651380 files

/opt/oracle/db04   (/dev/vx/dsk/ipasdg/db04_vol):41688928 blocks   651380 files

/opt/oracle/arch   (/dev/vx/dsk/ipasdg/arch_vol):164632064 blocks  2572348 files

/backup            (/dev/vx/dsk/ipasdg/backup_vol):314529872 blocks  4914519 files

   VXFSveritas公司推出的一种高性能,高可用性的文件系统,一般用于数据中心。它是基于扩展的文件系统,能够让应用程序读取和写入大的连续块。适用于OLTP系统和DSS系统。

  如果想在vxfs上面使用异步IO,首先必须要安装一个叫做Quick IO的模块,并且要启用Quick IO,这个模块是需要单独购买license的。默认的时候vxfs文件系统mount的时候是启用了Quick IO的,如果在mount的时候指定了-o noqio的选项,那么Quick IO是被禁用的。如果想查看在一个文件系统上是否采用了Quick IO,没有什么简单的办法的,常用的fsadminfstype这些命令都看不出来的,/etc/mnttab/etc/vfstab这些文件也没有记录相关的信息。这里介绍一个方法可以查看文件是否是Quick IO的文件:

ls -al   列出所有文件,包括Quick I/O文件和它的链接。

$ ls -al d* .d*

-rw-r--r-- 1 dba 104890368 Oct 2 13:42 .dbfile

lrwxrwxrwx 1 dba 17 Oct 2 13:42 dbfile -> .dbfile::cdev:vxfs:

ls -lL   显示是否Quick I/O被成功安装和启用。

$ ls -lL dbfile

crw-r--r-- 1 dba 45, 1 Oct 2 13:42 dbfile

第一个字符c,表明这是一个裸字符设备文件,如果没有这个文件则表明Quick I/O没有正确安装或者是没有一个合法的license key

  确认文件系统启用了Quick I/O后,然后就可以给Oracle配置异步I/O了,在Oracle的初始化参数中配置DISK_ASYNCH_IO = TRUE,然后重启数据库让其生效。

  因为启用了Quick I/O后,在OS级别上是消除了缓冲的,所以数据库的buffer cache在启用了Quick I/O后是需要增加的。

  可以用sar命令来观察文件系统的性能,主要查看%usr%sys%wio%idle这几列的值。我们一般都可以明显的看到CPU消耗在等待I/O上的时间比不采用之前少多了。

没有使用异步I/O情况:

    %usr    %sys    %wio   %idle

20:05:13       2      23       1      74

20:05:23       2      24       1      73

20:05:33       2      24       1      73 

Response time = 4 min 22 secs .

Oracle stats .

Statistic                                    Total   per Second    per Trans --------------------------------- ---------------- ------------ ------------

CPU used by this session                    25,188         99.6         25.2

CPU used when call started                  25,188         99.6         25.2

使用了异步I/O情况:

             %usr    %sys    %wio   %idle

19:53:37      17       9       0      74

19:53:42      16       8       2      74

19:53:47      16       7       2      75

19:53:57      17       7       0      75 

Response time = 37 secs .

Oracle stats . Statistic                                    Total   per Second    per Trans --------------------------------- ---------------- ------------ ------------

CPU used by this session                     2,119         96.3          2.1

CPU used when call started                   2,119         96.3          2.1

  如果在没有启用Quick I/Ovxfs文件系统上设置了Oracle的异步I/O,会造成Oracle性能极其低下,造成CPU的时间绝大多数消耗在I/O等待上的情况。当然,如果系统本来就不是很繁忙,I/O不是很多,CPU又足够的多,也可能体现不出来这个问题的。这个问题是Oracle的一个bugbug号码为1277145。因此,如果没有使用Quick I/O的话,在vxfs文件系统上还是不建议使用异步I/O的。

  我做了一个测试如下:

  没有启用Quick I/Ovsfs的文件系统下,设置了数据库的初始化参数DISK_ASYNCH_IO = TRUE,然后让数据库正常的写入数据,在os上跟踪Oracle后台的dbwr进程,查看其trace,就可以发现如果没有启用Quick I/O,实际上数据库设置了异步I/O,还是没法在os级别上实现异步I/O的。

ps -ef |grep ora_

oracle 16813     1  0   Nov 03 ?        0:02 ora_pmon_ORCL

oracle 16819     1  0   Nov 03 ?        0:53 ora_ckpt_ORCL

oracle 16831     1  0   Nov 03 ?        0:00 ora_d000_ORCL

oracle 16823     1  0   Nov 03 ?        2:31 ora_smon_ORCL

oracle 16815     1  0   Nov 03 ?       52:41 ora_dbw0_ORCL

oracle 16825     1  0   Nov 03 ?        0:01 ora_reco_ORCL

oracle 16827     1  0   Nov 03 ?        0:02 ora_cjq0_ORCL

oracle 16829     1  0   Nov 03 ?        0:00 ora_s000_ORCL

oracle 16817     1  0   Nov 03 ?       96:24 ora_lgwr_ORCL

oracle 16835     1  0   Nov 03 ?        4:11 ora_arc1_ORCL

oracle 16833     1  0   Nov 03 ?        4:14 ora_arc0_ORCL

 

truss -fl -p 16815

16815/1:        lwp_cond_signal(0xFFFFFFFF7CB8FF70)             = 0

16815/26:    lwp_cond_wait(0xFFFFFFFF7CB8FF70, 0xFFFFFFFF7CB8FF80, 0x00000000) = 0

16815/1:        kaio(AIOWAIT,0xFFFFFFFF7CB7DF70)   Err#22 EINVAL

16815/26:    pread64(408, "1B0280 2D09D".., 8192, 102400) = 8192

16815/1:     kaio(AIOWAIT,0xFFFFFFFF7CB7DF70)   Err#22 EINVAL             = 0

16815/26:       kaio(AIONOTIFY, 27977120) = 0

16815/1 :     kaio(AIOREAD, 408, 0x01B98DE0, 2048, 110592, 0x01A8486C) Err#48 ENOTSUP

  注意到调用kaio(AIOREAD,...)的时候返回了一个OS的错误,errno = 48# ENOTUP。这个并不是一个应用级别的错误,而是solaris异步I/O库调用的,产生这个错误表明文件系统并不支持核心的异步I/O,并且使用了一个同步进程调用取代了。在应用级别上模拟异步I/O而已。

最后谈谈怎么将已有的vxfs文件系统上的Oracle数据库转换成启用了Quick I/O上的Oracle数据库。Veritas Database Edition for Oracle提供了两个脚本文件用来转换,一个是getdbfiles.sh,一个是mkqio.sh,在/opt/VRTSordba/bin目录下。在转换之前数据库的数据文件必须是分布在vxfs的文件系统上的。

  Getdbfiles.sh这个脚本是用来从数据库的系统表中得到所有的数据文件的名字和位置等相关信息,必须要用oracle用户来运行的,得到的信息存储在mkqio.dat文件中。

   Mkqio.sh这个脚本是用来处理mkqio.dat文件中包含的所有数据文件,并将它们转换成Quick I/O上的数据文件,这个脚本也最好用oracle用户来执行,避免一些权限的问题出现,在运行完getdbfiles.sh脚本后,必须要先关闭数据库后才能执行mkqio.sh脚本。如果转换的时候出现什么问题,可以使用mkqio.sh -uQuick I/O上的文件转换回普通vxfs上的文件,这个脚本只能用于转换vxfs上的数据库文件,如果文件不是在vxfs文件系统上,那么运行了getdbfiles.sh后,必须手工在mkqio.dat文件中去掉那些不是在vxfs文件系统上的文件。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/3704/viewspace-488902/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2001-12-17

  • 博文量
    142
  • 访问量
    107402