以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
Oracle(大型网站数据库平台)9i 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.
连接到:
Oracle(大型网站数据库平台)9i 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 Oracle(大型网站数据库平台)redhat (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(WINDOWS平台上强大的数据库平台)'
2> go
Parameter Name Default Memory Used Config Value
Run Value Unit Type
------------------------------ ----------- ----------- ------------
----------- -------------------- ----------
allow sql server(WINDOWS平台上强大的数据库平台) 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(WINDOWS平台上强