免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2129 | 回复: 0
打印 上一主题 下一主题

RedHat AS上Sybase ASE和Oracle的ASYNC IO差异与性能影响 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-30 12:41 |只看该作者 |倒序浏览
RedHat AS上Sybase ASE和Oracle的ASYNC IO差异与性能影响







以Redhat AS 3.0的async io做范例来讨论异步IO对性能的影响以及Sybase ASE(单进程多线程)和Oracle(多线程)架构对异步IO不同的处理。以及OS参数对Sybase ASE的性能影响。

   OS kernel: 2.4.21-4.EL

   glibc: glibc-2.3.2-95.3

   DB: Adaptive Server Enterprise/12.5.1/EBF 11666 ESD#2

Oracle9i Enterprise Edition Release 9.2.0.4.0

   OS Parameter: /proc/sys/fs/aio-max-size 每一次异步IO的最大尺寸

                /proc/slabinfo  内核slab 分配统计



一: async io能够在以下方面提升性能

一: IO队列不需要等待所以磁盘可以对零散的IO进行组织以相对次数较少的io以提升性能。(吞吐量的提升)

二:进程可在等待IO完成前执行另外的任务以提升性能。(响应时间的改善)



二: OS相关文件

/proc/slabinfo:  kio开头的字段显示是否有应用在使用及使用状况。

此时ASE & Oracle都没有启动,所以当前活动对象数目都是0

[root@VMRHAS proc]# grep kio slabinfo

kioctx                 0     30    128    0    1    1 (kio请求次数)

kiocb                  0   8220    128    0  274    1(kio的对象数目)

kiobuf                 0     30    128    0    1    1(kio buffer)

各列的含义:

slab缓存名       当前活动对象数目  可活动对象的总数  每一个对象的字节数  最后一个活动对象的页数  总共分配的页数  每slab缓存的页数



启动oracle 后的slabinfo信息

[root@VMRHAS root]# su - oracle -c dbstart

[root@VMRHAS proc]# grep kio slabinfo

kioctx                 6     30    128    1    1    1

kiocb               6144   8220    128  205  274    1

kiobuf                 0     30    128    0    1    1

察看Oracle进程,在启动后有6个oracle的系统进程

[root@VMRHAS proc]# ps -ef |grep ora_

oracle    2683     1  0 11:06 ?        00:00:00 ora_pmon_redhat

oracle    2685     1  0 11:06 ?        00:00:00 ora_dbw0_redhat

oracle    2687     1  0 11:06 ?        00:00:00 ora_lgwr_redhat

oracle    2689     1  0 11:06 ?        00:00:00 ora_ckpt_redhat

oracle    2691     1  0 11:06 ?        00:00:00 ora_smon_redhat

oracle    2693     1  0 11:06 ?        00:00:00 ora_reco_redhat

从windows连接一个oracle进程过去再看slabinfo和linux上oracle进程的改变情况

c:\>;sqlplus "dbo/dbo@vmrhas"

SQL*Plus: Release 9.0.1.0.1 - Production on 星期三 11月 10 11:10:30 2004

(c) Copyright 2001 Oracle Corporation.  All rights reserved.

连接到:

Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.4.0 - Production

SQL>; select count(1) from v$session;

  COUNT(1)

----------

         7

[root@VMRHAS proc]# grep kio slabinfo

kioctx                 7     30    128    1    1    1

kiocb               7168   8220    128  239  274    1

kiobuf                 0     30    128    0    1    1



下面的pid为2740的进程就是windows连接的进程

[root@VMRHAS proc]# ps -ef |grep ora

oracle    2465     1  0 10:49 pts/2    00:00:00 /opt/oracle/product/9.2.0/bin/tnslsnr LISTENER -inherit

oracle    2683     1  0 11:06 ?        00:00:00 ora_pmon_redhat

oracle    2685     1  0 11:06 ?        00:00:00 ora_dbw0_redhat

oracle    2687     1  0 11:06 ?        00:00:00 ora_lgwr_redhat

oracle    2689     1  0 11:06 ?        00:00:00 ora_ckpt_redhat

oracle    2691     1  0 11:06 ?        00:00:00 ora_smon_redhat

oracle    2693     1  0 11:06 ?        00:00:00 ora_reco_redhat

oracle    2729     1  0 11:10 pts/2    00:00:00 oracleredhat (LOCAL=NO)

root      2740  1749  0 11:11 pts/0    00:00:00 grep ora



shutdown Oracle,再来看ASE的情况

启动ASE

[root@VMRHAS proc]# su - sybase -c asestart

[root@VMRHAS proc]# grep kio slabinfo

kioctx                 1     30    128    1    1    1

kiocb               1024   8220    128   35  274    1

kiobuf                 0     30    128    0    1    1



从windows建立一个sybase的连接过去

c:\>;isql -Usa -Svmrhas

Password:

1>; sp_who

2>; go

fid    spid   status       loginame     origname     hostname   blk_spid

         dbname     cmd              block_xloid

------ ------ ------------ ------------ ------------ ---------- --------

         ---------- ---------------- -----------

      0      2 sleeping     NULL         NULL                    0

         master     DEADLOCK TUNE              0

      0      3 sleeping     NULL         NULL                    0

         master     MIRROR HANDLER             0

      0      4 sleeping     NULL         NULL                    0

         master     ASTC HANDLER               0

      0      5 sleeping     NULL         NULL                    0

         master     CHECKPOINT SLEEP           0

      0      6 sleeping     NULL         NULL                    0

         master     HK WASH                    0

      0      7 sleeping     NULL         NULL                    0

         master     HK GC                      0

      0      8 sleeping     NULL         NULL                    0

         master     HK CHORES                  0

      0      9 sleeping     NULL         NULL                    0

         master     PORT MANAGER               0

      0     10 sleeping     NULL         NULL                    0

         master     NETWORK HANDLER            0

      0     11 sleeping     NULL         NULL                    0

         master     NETWORK HANDLER            0

      0     15 running      sa           sa           Test          0

         master     SELECT                     0

(11 rows affected)

(return status = 0)

可以看到只有一个spid为15的用户进程,其余都是系统进程。

此时再看slabinfo

[root@VMRHAS proc]# grep kio slabinfo

kioctx                 1     30    128    1    1    1

kiocb               1024   8220    128   35  274    1

kiobuf                 0     30    128    0    1    1

当关闭ASE的异步IO

c:\>;isql -Usa -Svmrhas

Password:

1>; sp_configure 'allow sql server'

2>; go

Parameter Name                 Default     Memory Used Config Value

         Run Value   Unit                 Type

------------------------------ ----------- ----------- ------------

         ----------- -------------------- ----------

allow sql server async i/o               1           0           0

                   0 switch               static

(1 row affected)

(return status = 0)

此时kioctx,kiocb都等于0

[root@VMRHAS proc]# grep kio slabinfo

kioctx                 0     30    128    0    1    1

kiocb                  0   1050    128    0   35    1

kiobuf                 0      0    128    0    0    1





从上面的这些输出可以看出oracle是一个多进程架构,即一个数据库连接会产生一个os的进程。如果开启了异步IO,可以看到每一个进程会打开1024个async IO的对象。而ASE是单进程多线程架构,即不管多少用户连接在OS上只会有一个dataserver的进程(SMP不在考虑之列,即多少个engine会有多少个dataserver的进程)。ASE不管多少用户进程都是一个dataserver进程打开1024个异步IO对象。ASE的引擎结构决定了由dataserver进程管理自己的network, disk IO和线程间通信资源,减少开销。

观察异步IO是否启用可以看kiocb的打开的异步IO对象数目,如果其为0代表没有启用。

关于slabinfo ,aio的详情如果安装了linux的source code的话,可以在/usr/src/linux-x.x/目录下看看aio.c和slab.c 或者man slabinfo。



/proc/sys/fs/aio-max-size

[root@VMRHAS proc]# cat sys/fs/aio-max-size

131072

更改aio-max-size的方法:echo xxx >;/proc/sys/fs/aio-max-size 或编辑/etc/sysctl.conf,添加一行fs.aio-max-size = xxx 然后sysctl –p



三:数据库参数

Oracle default 是关闭异步IO的。

  开启: make -f ins_rdbms.mk async_on

       make -f ins_rdbms.mk ioracle

  参数: disk_asynch_io=true(default true)

filesystemio_options=asynch( default none)



ASE: default 开启

参数: allow sql server async i/o (default 1)

     max async i/os per engine (default 2147483647)

     max async i/os per server (default 2147483647)

     disk i/o structures (default 256)

这里重点有两个参数。

     max async i/os per server指定一次能够同时进行的未完成的异步IO请求的数目,这个参数default就是最大值,我们一般不会进行调整。

disk i/o structures指定的是启动时分配的磁盘IO控制块的数目,即 max async i/os per server不能超过此值。这个参数数配置到操作系统所允许的最大值以避免有IO限制。关于这点,可以用sp_sysmon看到

下面是一段摘自sysmon的输出

I/Os Delayed by

    Disk I/O Structures               n/a           n/a           0       n/a  

    Server Config Limit               n/a           n/a           0       n/a  

    Engine Config Limit               n/a           n/a           0       n/a   

    Operating System Limit            n/a           n/a           0       n/a  



上面的disk i/o structures指出的就是由于磁盘IO控制块超限导致的IO延迟,需要加大该参数,一般在linux下到4096。等于default(256)时见过一次超限,所以<<System Administrator Guide>;>;指出将此值配置到OS的最大值。

至于server config limit和engine config limit没有见到过超限的,因为default值都是最大。



四:aio-max-size不同大小的性能影响

aio-max-size的大小基本可用从下规则来界定:dss因为进行大量的连续IO所以使用较大的值(1M甚至更大),如果是oltp则是进行大量的小型交易所以default的128K能够提供良好的性能。

以下的输出是在redhat as 2.1下单IDE硬盘,开启DMA分别在reboot后启动ASE直接创建1G data,512M log 2K page的数据库在aio-max-size等于128K和1M时的时间间隔分别是32min28S和1min1S。创建数据库是一个典型连续写的过程,从此可以看出该参数对性能的影响。

Apr  9 2004  2:07:38:803PM

(1 row affected)

CREATE DATABASE: allocating 512000 logical pages (1000.0 megabytes) on disk

'db_dat03'.

CREATE DATABASE: allocating 256000 logical pages (500.0 megabytes) on disk

'db_dat04'.

------------------------------

Apr  9 2004  2:40:06:843PM



------------------------------

Apr  9 2004  3:13:53:030PM

(1 row affected)

CREATE DATABASE: allocating 512000 logical pages (1000.0 megabytes) on disk

'db_dat03'.

CREATE DATABASE: allocating 256000 logical pages (500.0 megabytes) on disk

'db_dat04'.

------------------------------

Apr  9 2004  3:14:55:460PM

当然对于日常的应用不太会出现这么大的差异,但例如recovery,load database ,dbcc 或者large table scan,create index , bcp等大量IO操作时还是有相当大的影响。如果是混合以应用,例如ERP等就需要对此参数需要进行调谐了,oltp时使用较小值而进行月结等交易时加大此值。

使用sp_sysmon和dbcc,set statistics,vmstat等工具对个别交易进行测试,看得到的性能回报或者下降。

切记:任何的数据库或者OS调整都不会是一劳永逸,数据量,交易量或者交易类型的改变都可能需要另外调整。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP