对于数据库应用来说,之所以采用裸设备比采用文件系统具有更好的I/O 性能,主要是由于文件系统的一些特性: l 文件缓存 l 文件写保护锁或inode 锁 l 系统的sync 进程 这些文件系统的特性可以帮助保护数据的一致性,提高容错能力,事实上在许多情况下提高系统的性能。然而这些特性却经常对于数据库的应用的性能产生负面的影响。本文将解释文件系统中这些特性的作用,并介绍在JFS2 上的新功能如何消除它们对性能的影响。
Direct I/O 也不使用JFS2 的预读功能。文件系统的预读功能能够提高顺序读取文件时的系统性能。使用预读功能时,当发现应用程序顺序的访问一个文件时,操作系统试图预测此应用将要读取几个文件页,而预先将其读出,这将减少系统I/O 的次数。预读功能由两个参数控制: l j2-minPageReadAhead
图7说明了在测试当中每种情况下最多的系统锁,通过trace的工具我们观察到了三种主要的系统锁: l AIOQ锁:防止多个进程同时从AIO队列中插入或删除AIO的请求的锁。 l Inode锁:防止多个进程同时更新Inode的锁。 l SSA 锁:防止多个进程同时访问SSA设备的锁 从图6中可以看出在Direct I/O的方式下,系统的瓶颈是在Inode锁上,这会造成大量的context switch, 大量的进程处于等待状态,并且CPU也处于等待状态。降低了整个系统的吞吐率。而在裸设备和同步I/Od的方式下,没有大量的inode写保护锁。