數據庫系統是基於文件系統的,其性能和設備讀寫的機制有密切的關系。
和數據庫性能密切相關的文件I/O操作的三個操作:
open 打開文件
write 寫文件
fdatasync flush操作(將文件緩存刷到磁盤上)。
一、Open操作
open("test.file",O_WRONLY|O_APPDENT|O_SYNC))
系統調用Open會為該進程一個文件描述符fd。這裡使用了O_WRONLY|O_APPDENT|O_SYNC打開文件:
二、Write操作
write(fd,buf,6)
在使用open打開文件獲得文件描述符之後,我們就可以調用write函數來寫入數據了,write會根據前面的open參數不同,而表現不同。
三、Flush階段
fdatasync(fd) == -1
write操作後,我們還調用了fdatasync來確保文件數據flush到了disk上。fdatasync返回成功後,那麼可以認為數據已經寫到了磁盤上。像這樣的flush的函數還有fsync、sync。
忽略文件打開的過程,通常我們會說“寫文件”有兩個階段,一個是調用write我們稱為寫數據階段(其實是受open的參數影響),調用fsync(或者fdatasync)我們稱為flush階段。
Linux上的塊設備的操作可以分為兩類:
第一類是使用C標准庫中的fopen/fread/fwrite 系列的函數,我們可以稱其為 buffered I/O。
具體的I/O path如下
Application<->Library Buffer<->Operation System Cache<->File System/Volume Manager<->Device
library buffer是標准庫提供的用戶空間的buffer,可以通過setvbuf改變其大小。
第二類是使用Linux的系統調用的open/read/write 系列的函數,我們可以稱其為 non-buffered I/O。
I/O Path
Application<-> Operation System Cache <->File System/Volume Manager<->Device