歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 設備IO 研究與數據庫性能調優

Linux 設備IO 研究與數據庫性能調優

日期:2017/2/28 16:19:41   编辑:Linux教程

數據庫系統是基於文件系統的,其性能和設備讀寫的機制有密切的關系。

和數據庫性能密切相關的文件I/O操作的三個操作:

open 打開文件

write 寫文件

fdatasync flush操作(將文件緩存刷到磁盤上)。

一、Open操作

open("test.file",O_WRONLY|O_APPDENT|O_SYNC))

系統調用Open會為該進程一個文件描述符fd。這裡使用了O_WRONLY|O_APPDENT|O_SYNC打開文件:

  1. O_WRONLY表示我們以"寫"的方式打開,告訴內核我們需要向文件中寫入數據;
  2. O_APPDENT告訴內核以"追加"的方式寫文件;
  3. O_DSYNC告訴內核,當向文件寫入數據的時候,只有當數據寫到了磁盤時,寫入操作才算完成(write才返回成功)。
  4. 和O_DSYNC同類的文件標志,還有O_SYNC,O_RSYNC,O_DIRECT。
    • O_SYNC比O_DSYNC更嚴格,不僅要求數據已經寫到了磁盤,而且對應的數據文件的屬性(例如文件長度等)也需要更新完成才算write操作成功。可見O_SYNC較之O_DSYNC要多做一些操作。
    • O_RSYNC表示文件讀取時,該文件的OS cache必須已經全部flush到磁盤了【附錄3】
    • 如果使用O_DIRECT打開文件,則讀/寫操作都會跳過OS cache,直接在device(disk)上讀/寫。因為沒有了OS cache,所以會O_DIRECT降低文件的順序讀寫的效率。

二、Write操作

write(fd,buf,6)

在使用open打開文件獲得文件描述符之後,我們就可以調用write函數來寫入數據了,write會根據前面的open參數不同,而表現不同。

三、Flush階段

fdatasync(fd) == -1

write操作後,我們還調用了fdatasync來確保文件數據flush到了disk上。fdatasync返回成功後,那麼可以認為數據已經寫到了磁盤上。像這樣的flush的函數還有fsync、sync。

  1. Fsync和fdatasync的區別等同於O_SYNC和O_DSYNC的區別。
  2. Sync函數表示將文件在OS cache中的數據排入寫隊列,www.linuxidc.com並不確認是否真的寫磁盤了,所以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

Copyright © Linux教程網 All Rights Reserved