Informix数据库中异步I/O的应用
Informix数据库系统在银行、保险等行业里有着广泛的应用,鉴于银行和保险业务的特殊性,这些行业对于数据库都有较高的要求,因为数据库的性能直接关系到整个应用的好坏。提高数据库性能的方法很多, 这里介绍一种数据库与操作系统密切结合的应用——异步输入输出(AIO,Synchronous Input/Output),使用这种方式可以有效地缓解数据库的I/O瓶颈,从而提高数据库的整体性能。
异步I/O的特点
对系统发出I/O请求通常有两种方式: 同步I/O请求和异步I/O请求。同步I/O请求利用系统的缓冲区进行数据处理,当一个I/O操作执行时,应用程序必须等待,直到I/O操作执行完毕。而异步I/O操作是在后台执行,I/O操作和应用程序可以同时运行,从而增大了I/O流量,提高了系统性能。如果应用程序是对裸设备(Raw Device)进行操作, 则这种优势更加明显,因为使用裸设备避免了操作系统的介入,数据在数据库系统的管理下,不经过系统的缓冲区直接在磁盘和数据库的缓冲区之间进行传输。对于读写频繁、I/O成为瓶颈的数据库系统来说,使用异步I/O可以有效地提高系统的性能。
在Informix Dynamic Server(IDS)中采用异步I/O有两种方法: AIO虚拟处理机方式(CPU Virtual Processor,AIO VP)和核心AIO(Kernel Asynchronous Input/Output,KAIO)方式。核心AIO通过操作系统进行无阻塞的磁盘读写,改进I/O操作的性能。IDS中若使用KAIO,由进程内CPU虚拟处理机(CPU VP)服务,而不是由AIO虚拟处理机服务。KAIO通常比AIO虚拟处理机有更好的性能,一般在没有实现KAIO或对Cool Device进行I/O时,才用AIO虚拟处理机的方式负责进行数据库的I/O。
在Informix数据库使用KAIO,要考虑下列因素:
操作系统的支持 在Informix Dynamic Server(IDS)产品中,除了低版本的(现已经基本淘汰)外,都提供了对KAIO的支持。但是要想利用此功能,只有数据库的支持还不行,还要有操作系统的支持。
系统性能 使用KAIO的主要目的是提高数据库的I/O性能,若系统没有I/O瓶颈,则没有必要开启此项功能。
对裸设备进行I/O 这是使用KAIO提高I/O性能的物质基础。
异步I/O的配置
AIO VP在操作系统中不需要做特殊配置,只需在Informix的Onconfig文件中配置NumAIOVPS参数即可。而KAIO方式需要对操作系统和数据库进行配置,下面以SCO OpenServer 5.0.5为例说明操作系统的配置:
1.打开AIO的驱动。在默认的情况下,AIO是关闭的,必须使用命令进行配置才能开启它。方法是以超级用户(root)注册,执行命令“#mkdev aio”或“scoadmin”将AIO加入到系统核心中,系统将自动重新构造内核。
2.开启SUDS驱动。在AIO中要使用SUDS库中POS2X.1b规定可以使用的函数,必须先启动SUDS的驱动程序。具体方法如下:
(1)编辑/etc/conf/sdevices.d文件,将其中第二个字段的“N”改为“Y”。
(2)进入/etc/conf/cf.d目录,执行命令“#./link_unix ”重新连接核心,然后重新引导系统。
(3)使用suds_ctrl命令确定Informix用户组有权限使用suds库中的函数。可以使用命令“#suds_ctrl -a gid”,这里gid是Informix用户组组号,可在/etc/group文件中查阅。为了使用方便,通常的做法是在/etc/rc2.d目录下建立一个包含此命令的以大写字母“S”开头为文件名的文件(例如S99start_suds)。
(4) 调整与AIO相关的内核参数。
与AIO相关的内核参数有:NAIOPROC、NAIOREQ、NAIOBUF、NAIOHBUF、NAIOREQPP、NAIOLOKTBL,其具体含义读者可查阅相关资料。根据笔者的经验,其缺省值偏小,建议将这些参数增大,其调整方法是编辑/etc/conf/cf.d/mtune文件。调整完毕,需要重新连接核心并重新引导系统。调整结果如下(括号内为缺省值):
NAIOPROC | 50(5) | 1 | 500(16) |
AIORE1 | 400(120) | 5 | 4000(200) |
NAIOBUF | 400(120) | 5 | 4000(200) |
NAIOHBUF | 100(25) | 1 | 1000(50) |
NAIOREQPP | 400(120) | 30 | 4000(200) |
NAIOLOCKTAB | 50(10) | 5 | 500(20) |
在Informix中KAIO要进行如下配置:
1.用户环境变量的调整。缺省情况下KAIO是关闭的,激活的方法是:
KAIOON=1; 1-打开,0-关闭
export KAIOON (for Bourne or Korn Shell)
setenv KAIOON 1 (for C Shell)
2.Onconfig配置文件中有关参数的调整。与此相关的参数是NumAIOVPS,它表明处理磁盘I/O的虚拟处理器AIO类的虚拟处理器数目。如果系统中使用KAIO而且没有Cool Device,则将NumAIOVPS设置为1或2(小型系统设置为1,较大系统设置为2),如果有Cool Device或系统不支持KAIO,这时系统使用AIO VP方式进行数据I/O,可将NumAIOVPS设置为系统中活动磁盘数的两倍。
异步I/O的监测
在完成异步I/O的配置后,还需要对其实际运行状况进行监测。要查看操作系统中AIO的运行状态,可以用root用户注册,执行命令“#aioinfo”,该命令可以返回AIO配置和使用的信息和内部统计表。要监测AIO的请求情况可以执行命令“sar -O m n”,它表示每隔m秒检测一次,共检测n次。如果监测AIO的buffer使用情况,可以执行命令“sar -h m n ”。如果要在Informix数据库下监测AIO的运行,可以执行下列命令查看AIO的相关情况:“onstat -g ***”,这里“***”可以是“ath”、“iob”、“ioq”等。
当然,在SCO OpenServer 5下使用KAIO也存在一定局限性。比如,在使用KAIO时,操作系统对物理内存中的内存段加锁,并且标记为只能为KAIO程序使用。一旦内存段被加锁,它将不能被操作系统选为页交换的内存使用,对于内存不大的系统将导致内存不足。另外,要特别提醒读者的是,如果IDS的Server端和Client端的环境变量KAIOON不一致(即KAIOON不是同时打开或同时关闭),启动数据库后在Client端运行onstat命令时,可能产生错误的输出。具体情况如下表:
说明:oninit对应KAIO是“on”,代表Server端数据库启动时打开了KAIO功能,“off”则表示关闭了KAIO功能;onstat对应KAIO是“on”,代表Client端数据库启动时打开了KAIO功能,off则表示关闭了KAIO功能;error from onstat 对应“NO”,表示onstat命令的输出是正确的,“YES”则表示输出是错误的。