陶方在《innodb_flush_method帶來的效能影響》中從實驗角度比較了fdatasync,o_dsync和o_direct在效能上的差異。本文將試圖從linux/unix"檔案i/o"(unbuffered i/o)的角度來解釋innodb_flush_method是如何影響mysql的i/o。【附錄1】
innodb_flush_log_at_trx_commit引數確定日誌檔案何時write、flush。innodb_flush_method則確定日誌及資料檔案如何write、flush。在linux下,innodb_flush_method可以取如下值:fdatasync, o_dsync, o_direct,那這三個值分別是如何影響檔案寫入的?首先我們需要先來了解linux的檔案i/o是如何工作的。
先來看看linux/unix檔案i/o的乙個典型例子:(linux 2.6.24測試,gcc編譯)
程式描述了一般的檔案i/o操作的三個過程open、write、fdatasync,分別是開啟檔案、寫檔案、flush操作(將檔案快取刷到磁碟上)。/**a test about syscall of file i/o
author:supu@taobaodba
*/#include "stdlib.h" /* for exit */
#include "unistd.h" /* for write fdatasync*/
#include "fcntl.h" /* for open */
int main(void)
char buff="abcdef";
if(write(fd,buff,6)!= 6)
if(fdatasync(fd)==-1)
exit(0);
}
一、open階段
o_wronly表示我們以"寫"的方式開啟,告訴核心我們需要向檔案中寫入資料;
o_dsync告訴核心,當向檔案寫入資料的時候,只有當資料寫到了磁碟時,寫入操作才算完成(write才返回成功)。和o_dsync同類的檔案標誌,還有o_sync,o_rsync,o_direct。
二、write階段
write(fd,buf,6)在使用open開啟檔案獲得檔案描述符之後,我們就可以呼叫write函式來寫入資料了,write會根據前面的open引數不同,而表現不同。
三、flush階段
fdatasync(fd) == -1write操作後,我們還呼叫了fdatasync來確保檔案資料flush到了disk上。fdatasync返回成功後,那麼可以認為資料已經寫到了磁碟上。像這樣的flush的函式還有fsync、sync。
fsync和fdatasync的區別等同於o_sync和o_dsync的區別。
sync函式表示將檔案在os cache中的資料排入寫佇列,並不確認是否真的寫磁碟了,所以sync並不可以靠。
忽略檔案開啟的過程,通常我們會說「寫檔案」有兩個階段,乙個是呼叫write我們稱為寫資料階段(其實是受open的引數影響),呼叫fsync(或者fdatasync)我們稱為flush階段。
回到mysql,引數innodb_flush_method(linux)可以設定為:fdatasync、o_dsync、o_direct。我們看看這個三個引數是如何影響程式mysql對日誌和資料檔案的操作:
open log
flush log
open datafile
flush data
fdatasync
fsync()
fsync()
o_dsync
o_sync
fsync()
o_direct
fsync()o_direct
fsync()
fdatasync被認為是安全的,因為在mysql總會呼叫fsync來flush資料。使用o_dsync是有些風險的,有些os會忽略該引數o_sync。
我們看到o_direct和fdatasync和很類似,但是它會使用o_direct
來開啟資料檔案。有資料表明,如果是大量隨機寫入操作,o_direct
會提公升效率。但是順序寫入和讀取效率都會降低。所以使用o_direct需要謹慎。
參考文章:
unix環境高階程式設計(第二版)
系統呼叫:
可以簡單的理解為:「系統呼叫「是在核心之上的一層封裝。由核心直接提供介面,「系統呼叫」需要陷入核心執行(核心態)。其中fdatasync就是乙個系統呼叫,該系統呼叫可以通知os立刻將os cache中的資料flush到磁碟檔案中。
【附錄2】這時候核心會為該該程序開啟的檔案分配乙個檔案描述符,並將該檔案描述符返回給該程序。在核心的檔案表中新建乙個檔案項,標記檔案狀態、檔案當前偏移、以及i節點(v節點)的位置,核心還會開啟該檔案的i節點(這裡記錄檔案的操作的函式指標,例如讀操作、寫操作)。
【附錄3】o_rsync我的理解是,對於同乙個檔案描述符可以保證讀資料安全。同乙個檔案描述符包括dup和fcntl函式dup的檔案描述符,即共用同乙個檔案表項。o_rsync不是我們今天關注的,暫時忽略
未解問題:
o_direct在哪些os(或者fs)上能夠正常工作?
o_sync在哪寫os上不能正常工作呢?
核心的read、write是fs級別的還是核心(kernel)級別?
文章innodb_flush_method帶來的效能影響中o_dsync、和fdatasync效率差很多,這是為什麼?
Null,DBNULL等的區別?
1.對dbnull的解釋 該類用於指示不存在某個已知值 通常在資料庫應用程式中 在資料庫應用程式中,空物件是字段的有效值。該類區分空值 空物件 和未初始化值 dbnull.value例項 例如,表可以包含具有未初始化欄位的記錄。預設情況下,這些未初始化字段具有dbnull值。該類還可以用於在com ...
「等燈 等燈等燈」, 和 的區別
小記錄。是相等操作符,是全等操作符 的判斷標準為兩個運算元相等則返回true,的判斷標誌是兩個運算元未經轉換就相等則返回true 相等操作符的轉換規則 如果有乙個運算元是布林值,則在比較相等性之前先將其轉換為數值,false轉換為0,而true轉換為1 乙個運算元是字串,另乙個運算元是數值,則在比較...
關於jvm tomcat jboss等的引數配置
總是遇到一些outofmemoryerror,但是明明 寫得好好的,沒有出現明顯的大物件沒有 位址洩露等情況,這個時候我們應該想到設定大點的記憶體相關引數設定試試。如果還是不行,可能要從 著手了。下面是jvm tomcat jboss等的引數設定 xms128m xmx256m xx permsiz...