关于oracle数据块跟操作系统数据块的关系

关于oracle数据块跟操作系统数据块的关系


目录(?)[+]

参考文档:

http://www.itpub.net/thread-1081114-1-1.html

http://storage.it168.com/a2011/0323/1169/000001169755_all.shtml

http://www.msexchange.org/articles-tutorials/exchange-server-2003/planning-architecture/Disk-Geometry.html

 

这个问题是由《oracle 9i DBA手册》中区分oracle段、区间和段的概念引起的,但是查到的资料却是异常乱杂的,各种说法,具体的纠结是有参考文档中的第一个帖子引起的,以至于我看了好多帖子之后,最后对这其中的概念有了一些认识之后,还是需要重新回头去看这个帖子,然后才终于能下笔写这个问题了。参考文档太多,就只写比较重要的这两个吧。

硬盘级的概念

硬盘本身是物理东西,他就是金属盘片上涂了一层磁性介质而已,它如果要按照逻辑的想法去正常工作,最首先的是驱动程序这一块。驱动程序是直接附加在物理硬件上的一层底层软件。驱动程序完成对硬盘的一切操作。

虽然驱动程序是操作系统的一部分,但是在理解的时候,驱动程序应该剥离出来,与物理硬件一起被当做一个整体去理解,这才是可以使用的硬盘。而剥去驱动的硬盘只不过是几块金属片而已。

对硬盘的读写的最小单位是扇区。这是在驱动层规定的。

硬盘读写的定位是由3个参数确定的

磁头号。这个参数确定盘面,我们知道磁盘内部是多个金属圆盘,每个圆盘有两个面,每个面都对应一个磁头,确定了磁头号就是选择了要进行读写的盘面。

柱面。这个参数跟磁道有很深渊源的词,柱面就是确定磁道的。磁道是盘面上一个个的同心圆。

扇区。原本我一直以为扇区是一个形状,就是扇形的意思。但是在磁盘读写的时候,扇区又被赋予了其他含义,就是你确定了磁头号和柱面号之后,再去说对对某个扇区进行读写,此时这个扇区已经不是一个扇形,而是一个圆弧。我们现在说一个扇区是512Byte,就是说在这个圆弧上写这么多数据,而不是在这个扇形区域的所有圆弧上一共写512Byte。这个扇区的大小也是驱动层面就定义的。

再说下磁盘的性能参数。

影响磁盘读写效率的参数主要也是3个。

寻道时间:磁盘在不进行读写的时候是停在盘面中心上方的。当磁盘进行读写操作时,磁盘臂首先定位到磁道。这个定位到磁道的时间就是寻道时间。

转速。磁盘在寻道结束后,接下来就是寻找到要读写的扇区。寻找到要读写的扇区时间就跟转速有关了,转的越快找到扇区的速度越快。

数据传输速度。这个参数是单纯进行读写的速度,即一秒钟能读写多少数据,它跟硬盘接口有一定关系,也是硬盘的硬属性。

再就是I/O

I/O意思为读写,是为一次读写操作。注意这里,把I/O理解为一种操作。对于设备而言,一次I/O操作就是上层向驱动发来读写请求,驱动程序控制磁盘完成读写并将数据提交给上层的过程。所以,磁盘层面上的I/O chunk size是跟请求有关的,请求读取的数据大小决定了它的大小,它并不是一个固定值。

操作系统级别

块的概念

首先这个操作系统级别严格来说就是文件系统级别了,因为正是操作系统内的文件系统这块负责处理文件的I/O等各种操作。以后就直接说文件系统吧。

文件系统不可能针对扇区进行寻址,那样的话需要维护的地址表过于庞大。所以,在文件系统级别,文件系统对自己可寻址的硬盘块进行了重新的定义,这个定义是在格式化的时候确定下来的,它必须是扇区大小的整数倍。这个在文件系统级别定义的硬盘块就是OS space allocation block size。在windows中这个叫做簇,在其他操作系统中叫做block(块)。一个块内只能存储一个文件,比如定义块为2k,那么5k的要占用3个块。

操作系统级别的I/O

操作系统的上层是应用,当应用发来I/O请求要读取一个文件时,操作系统收到请求后,首先在文件系统的地址表中找到这个文件对应硬盘上的块地址。然后,对每一个块产生一个I/O请求,发送到驱动模块处理。所以,在操作系统级别,I/O chunk size等于OS block size

oracle数据库级别

Db_block_size的定义

oracle数据库中的文件也是以块为单位进行读写的。块的大小在初始化参数文件中由db_block_size参数指定。Oracle官方建议这个参数的大小等于或整倍数与操作系统中的块大小。这是因为,操作系统是以一个块大小发出一个I/O请求的,所以如果你的oracle块大小是操作系统块大小的1.5倍,比如操作系统块大小为2k,那么oracle每次请求3k的数据,操作系统需要为这3k数据发出两个I/O请求。而实际上,这两个I/O请求最大可读取4k的数据,这种设置可能会增加操作系统的I/O请求数,可能造成操作系统I/O瓶颈。

操作系统的块大小在windows下可以使用命令fsutil  fsinfo  ntfsinfo  c:进行查看。在linux下可以使用tune2fs  -l  /dev/sda1(文件系统路径)进行查看。

以上这种方式是通过文件系统这一层进行读写。

下面说下Oracleraw设备读写的过程。

oracle数据库的数据文件存放使用裸设备这一做法。裸设备避免了经过文件系统处理的这一层,数据直接从disk传到oracle。这种方式对于读写操作频繁的数据库应用,并且磁盘级的i/o非常大的情况下,可以很大地提高数据库系统性能。

下图是unix的内核分解图。

 

对于raw设备而言,oracle是直接走device control那条线,直接调用内核中的驱动模块,对硬盘进行读写操作。所以这种情况下,硬盘的一次I/O chunk size 就跟oracle的请求数据的大小有关了,这种情况下,硬盘的I/O  chunk  size不在是一个固定的值。

以上就是我对这个问题的暂时的理解,当然,过程如果再细化的话似乎要更复杂。比如文件系统级别那一层,除了经过文件系统进行读写之外,还有direct I/O方式,可以让应用bypass文件系统使用硬盘。还有就是文件系统层有i/o缓冲区,硬盘处理那一层好像也有缓冲区。具体有这些缓冲区的机制下,数据请求是怎么被回应的,这些问题还是一头雾水。此外还有同步i/o和异步i/o的概念,概念似乎很好理解,但是真正怎么个工作流程又不知道了。

关于上面的总结,不知道有致命的概念错误没有,希望懂的人不吝指教。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值