分类: 服务器与存储
2008-07-13 16:44:03
本文是讲述有关Oracle数据库磁盘输入输出性能和优化的各个不同方面的一系列文章中的一篇。每篇技巧性的文章都摘自即将由Rampant科技出版社出版的图书《Oracle磁盘输入输出性能调优》,作者是Mike Ault。从该系列文章的主页上能看到其他即将发布的部分。
异步输入输出
当某个进程试图通过read()或write()系统调用来进行读或写操作时,它必须等待,直到物理输入输出完成。一旦获悉这个读或写操作的结果,不论是成功还是失败,这个进程就完成了这次读或写操作。在这期间,这个进程的执行被阻塞,它等待其进行的系统调用的结果。这就是异步或阻塞输入输出。
尽管如此,我们想要的方法却是非阻塞的异步输入输出。如果某个进程使用异步的aio_read()或aio_write()系统调用,则这个输入输出请求一旦被传递给底层硬件或者在操作系统中排队,系统调用就会立即返回,典型情况是在实际物理输入输出操作开始执行前就返回。从而使得这个进程可以继续执行,一段时间后,能够得到输入输出操作的结果的时候,再接受该次输入输出操作的结果,
异步输入输出使得类似Oracle的DBWn的写密集型进程能够充分利用硬件的输入输出带宽,通过将输入输出请求在不同设备上排成连续队列的方式,使得这些读写操作大部分以并行的方式被处理。异步输入输出也允许那些进行计算密集型操作(比如排序操作)的进程能够在数据被使用前从磁盘上预取数据,从而使得输入输出操作和计算能够并发执行。
异步输入输出的性能主要取决于使用内核级异步输入输出,还是使用线程级异步输入输出。
* 对于内核级异步输入输出而言,由内核分配一个异步输入输出请求,并通过调用设备驱动程序的某个入口来建立这个异步输入输出请求。紧接着,设备驱动程序将这个物理输入输出操作排队,并将控制返回给调用该输入输出过程的进程。当物理的输入输出操作完成时,由硬件向CPU发出一个中断。然后,CPU切换中断服务上下文,并调用设备驱动程序的中断服务程序来更新这个异步输入输出请求数据结构,还有可能使用SIGIO信号来唤醒调用进程。
* 由线程实现的异步输入输出使用内核的轻量级进程功能来模拟异步输入输出,通过将多个同步输入输出请求分配给不同的线程来执行。这样取得的输入输出并行性是以伴随线程创建和额外的上下文切换而带来的资源消耗为代价的。如果线程级异步输入输出被大量使用,它们所带来的资源消耗大概占系统CPU使用率的5%。基于这个原因,我们推荐使用内核级异步输入输出的方式。
内核级异步输入输出,通常被称为KIO,只有在底层文件系统使用Oracle磁盘管理器API、Veritas快速输入输出或者类似产品时才可获得,而这些产品是将输入输出请求发送给某个假想设备驱动器的,这些假想的设备能够作为异步输入输出请求完成的场所。许多操作系统都需要对设备文件、设备驱动器和内核参数进行特殊配置,从而激活并且调节内核级异步输入输出。要想取得异步输入输出显然是个非常复杂的配置过程。
好消息是KIO对于自动存储管理(ASM)文件是自动获得的。
条带
在数据库文件的布局中,我们经常看到许多热点,这些热点是那些被经常访问的同一个磁盘或磁盘集。经常性地,这就会导致很长的等待磁盘输入输出的队列,并且不能利用磁盘输入输出的并发性。
将Oracle数据库文件分散到多个物理磁盘轴提高了对热点访问的并发性,通常情况下,也将提高大规模读写操作的传输率,并且更加均匀地将输入输出负载分摊到所有可获得的磁盘上。条带技术将输入输出负载均匀地分摊到该条带中的所有磁盘中去。这就使得存储硬件的全部输入输出带宽被用来服务所有的输入输出工作成为可能的。使用更少、更大的存储空间磁盘的趋势使得能够以这种方式使用全部输入输出带宽变得越来越重要。
当条带技术在存储阵列级或者硬件级被实现时,Oracle数据库文件天生就具备条带技术带来的好处。条带技术也可以通过使用某个合适的卷管理工具来实现。
自动存储管理(ASM)在主机级上提供通用卷管理工具所提供的条带技术。这就使得我们再也无需使用昂贵的条带技术软件。