有关报道:SAP系统在AIX下的参数优化
应用的需求,因此需要进行一些调整。AIX操作系统中,一般将内存的使用分成两个部分,一个部分用于应用程序运行使用,称为计算内存(Computational),另一部分用于文件缓存,称为文件缓存(Non-Comp),AIX操作系统通过 minperm%,maxperm%, maxclient%, strict_maxclient, lru_file_repage,minfree, maxfree, 等参数控制系统的内存使用.
在SAP应用环境下建议将以上参数设置为:
vmo -p -o strict_maxclient=0
vmo -p -o lru_file_repage=0
vmo -p -o minperm%=3
vmo -p -o maxclient%=8
vmo -p -o maxperm%=8
vmo -p -o minfree=[CPU数量]*120
vmo -p -o maxfree=[CPU数量]*128
如果CPU数量是12,则minfree=1440, maxfree=1536
使用AIX 并行I/O (Concurrent I/O) 来提高数据库的性能
内容提要:
AIX 5L v5.2.0.10( 或称作AIX 5L v5.2 ML01) 在增强的日志文件系统(JFS2) 上引入了并行I/O (Concurrent I/O) 的新的功能。在许多应用环境下,这一新的功能可提高文件系统访问的性能,尤其对于关系型数据库的应用。在JFS2 的文件系统上采用并行I/O (Concurrent I/O) 技术后,可以得到与采用裸设备相似的性能。本文将对并行I/O (Concurrent I/O) 做一个简要的介绍并给出在Oracle 9i 数据库上进行性能比较的结果。
说明:
1. 简介
文件系统长久以来一直是UNIX 存储管理的核心,UNIX 的用户通过系统命令和系统接口对存储在文件系统上的数据进行操作和管理。文件系统的使用提供了对数据进行存储的有效手段。
如同使用其它方式一样,文件系统的使用是对于性能与易用性平衡的结果。在应用和磁盘之间传输数据最快的方式是直接进行访问,如使用裸设备。而使用文件系统来存数数据会产生很多额外开销,如串行访问,缓存和数据拷贝。这些都将对性能产生影响。使用裸设备进行数据的存储虽然能减少这些额外开销,但对用户的技术水平要求较高,而且不同应用程序对裸设备的使用方式也不同,需要对用户进行额外的培训。但由于对裸设备进行访问的高性能,传统上来说,数据库的应用程序更希望使用裸设备而不是文件系统。
在JFS2 文件系统上采用并行I/O (Concurrent I/O) 技术后,数据库用应用可以得到与采用裸设备相似的性能。
2. 数据库应用
对于数据库应用来说,之所以采用裸设备比采用文件系统具有更好的I/O 性能,主要是由于文件系统的一些特性:
▲文件缓存
▲文件写保护锁或inode 锁
▲系统的sync 进程
这些文件系统的特性可以帮助保护数据的一致性,提高容错能力,事实上在许多情况下提高系统的性能。然而这些特性却经常对于数据库的应用的性能产生负面的影响。本文将解释文件系统中这些特性的作用,并介绍在JFS2 上的新功能如何消除它们对性能的影响。
2.1 文件缓存
从最基本的层面来说,文件就是在介质上所存储一些二进制位的集合,当一个进程需要从某个文件访问数据的时候,操作系统将这些数据读入内存,然后此进程可以对数据进行操作,最后将处理完的数据写入磁盘。操作系统能够从磁盘上直接读出或写入数据,但是由于磁盘较慢的访问速度,这些操作的响应速度和吞吐率都较差。因此操作系统试图通过文件缓存的技术,即在内存中缓存数据的方法,来减少对磁盘的访问频率。当进程需要从文件中读取数据的时候,操作系统首先试图从文件缓存中读取所需要的数据,如果这些数据不在文件缓存中,那么从磁盘上文件系统的文件中读取,同时将这些数据缓存在文件缓存中。如图1 和图2 所示:
图1 读操作- 数据在文件缓存中(命中)
图2 读操作- 数据不在文件缓存中(没有命中)
与读数据相似,当写数据时数据写入文件缓存,因此将来需要再读取这些数据时,不需要访问磁盘,同时也降低了写磁盘的频率。当缓存的命中率高时,使用文件缓存将是非常有效的。并且可以采用预先读取和延迟写的技术来减少磁盘访问的频率。文件缓存所带来的另一个好处是,以异步的方式进行写操作,这使得应用可以继续运行,而不用等待数据写入磁盘操作的完成,如图3 所示。
虽然文件缓存提高了I/O 的性能,但是它消耗了大量的系统内存。AIX JFS2 文件系统允许系统管理员控制可以作为文件缓存的最大内存数。这种控制通过maxclient% 参数控制。系统管理员可以使用vmo 命令来调整maxclient% 参数。maxclient% 的却省值是80 ,其含义是80%
的物理内存能够作为文件缓存。maxclient% 参数的取值可在1 至100 之间变动。如可以采用以下命令设置最多50% 的系统物理内存能够作为文件缓存:vmo ?Co maxclient%=50 。
图3 写操作
与此相对应,裸设备不使用系统内存来缓存应用的数据,所以没有以上图示的操作。
2.1.1 直接存取(Direct I/O )
一些应用程序并不能从文件缓存中得到好处,如有些进行大量科学运算的程序,从不访问以前访问过的数据,而且由于他们对数据进行顺序访问,这使得文件缓存的命中率非常低。数据库的应用通常在应用层上有自己的数据缓存技术,所以不需要操作系统进行文件缓存。在这种情况下,使用文件缓存会产生很多额外开销,因为数据首先从磁盘被读入系统的文件缓存,然后从文件缓存拷贝到应用的缓存中,这被称为“重复拷贝”(double-copying ),重复拷贝增加了额外的CPU 开销,并且相同的数据同时在文件缓存和应用的缓存中,增加了内存的消耗。
JFS2 的直接存取(Direct I/O )技术可以使应用程序的数据被系统的文件缓存忽略。当使用Direct I/O 时,数据直接从磁盘读取到应用程序的缓存中,而不是用系统的文件缓存。图4 和图5 说明了在Direct I/O 下的读、写操作。
图4 Direct I/O 的读操作
图5 Direct I/O 的写操作
2.1.1.1 Direct I/O 的设置方法
Direct I/O 可以通过两种方式实现,一是通过在mount 文件系统时加 ?Co dio 的参数,即 mount ?Co dio /fs 。二是在调用open() 函数打开一个文件时加O_DIRECT 参数。当一个文件系统在mount 时使用了?Co dio 的参数,此文件系统的所有文件缺省都会使用Direct I/O ,你也可以通过namefs 使得Direct I/O 只对文件系统中某个子目录中的文件起作用。例如:文件系统somefs 中有一些文件希望使用Direct I/O 功能,但是其它文件并不希望使用,你可以创建一个子目录subsomefs ,将所有希望使用Direct I/O 功能的文件放入这个子目录,在mount somefs 时不使用-o dio 参数,然后用mount ?Cv namefs ?Co dio /somefs/subsomefs /somefs 命令mount subsomefs 。
Direct I/O 对应用程序I/O 的边界(alignment )和块大小(length )有限制,表1 列出了JFS2 对此的要求,如果应用的I/O 不满足此要求,所有的I/O 操作会按传统的方式(文件缓存)的方式进行,但当数据被传输到应用的缓存后,系统缓存中的拷贝会被抛弃。当使用Direct I/O 时,文件系统的预读功能将不会起作用。
表1 JFS 对Direct I/O 的限制