本文中,我们将主要讲解缓冲日志文件I/O的两个重要性能问题,具体内容如下:
1.缓冲日志I/O会经历局部块写。因为重做写随机的日志块号并且日志块相对于文件系统缓冲较小。通常重做写的最后一个日志块不会分配到文件系统缓冲结尾。因此,除非日志文件旧映像所在的目标文件块仍在缓存中,否则在重做拷贝到其文件系统缓冲的另一部分前必须将那个块从磁盘读取到内存。从日志文件预读主要用于缓冲重做写。
如果磁盘阵列有很大的缓存并且在日志文件上具有高效的预推进算法,那么预读花费的时间可能非常小,并且不会推迟重做写。但是如果预读和重做写要求物理磁盘服务,则肯定会有额外的延迟,并且等于磁盘全旋转的延迟。
2.缓冲日志I/O也会经历I/O碎片。当重做写到多个文件系统缓冲时,每个缓冲的物理写无法排队为并行的,因此不能被硬件流水线操作。相反,组件物理写串行执行,并且在每对写之间维持一个完全的旋转延迟。
这些问题都可以通过使用文件系统直接I/O或者使用裸日志文件解决。裸I/O通常比直接I/O更好,因为其允许更有效的使用异步I/O。
LGWR需要异步I/O并行化写多个日志文件成员以及在事务提交时迭代重做写。可以使用硬件镜像重做日志以避免串行写到多个日志文件成员,并且可以使用硬件镜像最小化重做写的CPU代价。但是异步I/O需要迭代随后的重做写,因为LGWR I/O slaves不会一致的做该工作。裸I/O使得异步I/O有可能实现,而其他的需要LGWR依赖线程异步I/O或LGWR I/O slaves。
注:部分块写,I/O碎片和同步I/O写都会严重影响LGWR's I/O的性能及可扩展性。