引用:
原帖由 冬瓜头 于 2007-2-12 08:31 发表
感谢这位仁兄的数据库方面的解释,受教了,不过有一句话我不同意:
“如果使用裸设备,oracle自己IO,绕过操作系统”
oracle使用裸设备也绕过os么?oracle有自己的磁盘控制器驱动?和os是两套驱动程序?如 ...
这句话说的不太严谨,我的确不知道OS是否有系统调用可以不buffer dirty data,而是直接write。
建议你去了解一下ORACLE的SGA(内存区域),这块内存区域当中有一个子区域叫buffer cache,它是做什么的呢?
buffer cache缓存脏块,即dirty block,而不是每次commit的时候就往磁盘上面去write,这样做和大多数buffer的功能是一样的,目的就是为了最大限度的利用磁盘的IO bandwith。
buffer cache还要cache从磁盘上读取出来的block,目的为了提高hit ratio。
所以说,它不需要再从OS里面提供的buffer或cache去绕一圈。
raw device本身是character device,其IO Unit为byte,我们知道一个硬盘的IO Unit是sector,也就是512 bytes。你说用了raw device,硬盘就能改成1 byte per IO request了吗?也不是。那么就肯定要攒到了512bytes才write一次吧?(猜测)那么这样的buffer是谁来提供的呢?我认为是oracle提供的。
但是what the hell the objective of using raw device?使用raw device或者CFS只是为了绕开native file system的open lock,spin(这些机制oracle自己提供,而且功能完备)让更多的hosts去修改同一个数据文件(我在这里的理解是,它降低了的对数据的修改粒度,从native file system中的文件尺度,下降到了byte的尺度)。附带好处是可以绕开OS的buffer与cache的机制。而没有绕开device driver,单实例的oracle数据库并没有一味的去强调使用raw device吧?只有在rac环境中才这样。
站在VFS这堵墙后面,我们有了raw device和block device之分,跨过这堵墙,我们看到的basic unit是sector。