innodb_flush_method和innodb_flush_log_at_trx_commit

rainbowbridg發表於2011-12-05
innodb_flush_log_at_trx_commit:
主要控制了innodb將log buffer中的資料寫入日誌檔案並flush磁碟的時間點,取值分別為0、1、2三個。0,表示當事務提交時,不做日誌寫入操作,而是每秒鐘將log buffer中的資料寫入日誌檔案並flush磁碟一次;1,則在每秒鐘或是每次事物的提交都會引起日誌檔案寫入、flush磁碟的操作,確保了事務的 ACID;設定為2,每次事務提交引起寫入日誌檔案的動作,但每秒鐘完成一次flush磁碟操作。顯然,設定為0或2可以減小系統的io壓力,特別是0 時,速度最快,提高mysql寫操作的吞吐量,但mysql或作業系統的崩潰、斷電都可能會引起資料的丟失,設定為2時os的崩潰和斷電可能會引起資料的 丟失。

innodb_flush_method:


影響了伺服器flush資料或日誌檔案的方法。具體有三個選值:預設的default,innodb使用fsync()函式flush資料和日誌文 件;O_DIRECT,innodb使用O_DIRECT的方式開啟資料檔案,並使用fsync()函式flush資料和日誌文 件;O_DSYNC,innodb使用O_SYNC開啟並flush日誌檔案,使用fsync()函式flush資料檔案。

注:在類unix作業系統中,檔案的開啟方式為O_DIRECT會最小化緩衝對io的影響,該檔案的io是直接在使用者空間的buffer上操作 的,並且io操作是同步的,因此不管是read()系統呼叫還是write()系統呼叫,資料都保證是從磁碟上讀取的;O_SYNC方式表示以同步io的 方式開啟檔案,任何寫操作都將阻塞到資料寫入物理磁碟後才返回。fsync(int filedes)函式只對由檔案描述符filedes指定的單一檔案起作用,並且等待寫磁碟操作結束,然後返回。fdatasync(int filedes)函式類似於fsync,但它隻影響檔案的資料部分。而除資料外,fsync還會同步更新檔案的元資訊到磁碟。

sync_binlog:


影響了binary log的fllush,當為1時,每個事物提交後,mysql將用fdatasync()函式將二進位制日誌同步到磁碟上;當為0時,mysql不會做額外的flush,而是依靠os的flush。

做過一些相應的測試,獲得一些以上三引數搭配使用的結論:

1)O_DIRECT的flush_method更適合於作業系統記憶體有限的情況下(可以避免不必要的對交換空間的讀寫操作),否則,它會由於禁用了os的緩衝降低對資料的讀寫操作的效能。

2)Sync_binlog為1時,每個含有修改操作的事物提交後,mysql將把二進位制日誌同步到磁碟上,增大了io壓力,引起相應瓶頸,會降低對資料寫操作的效率。而select操作不寫入binary log,所以不受任何影響。

3)對於innodb_flush_log_at_trx_commit與innodb_flush_method的不同組合(0|1|2,default|O_DSYNC)(對於O_DIRECT的情況特殊,已經在1)中單獨做了總結在此不累述)分析得:

①(0, default)每秒鐘呼叫fsync()同步一次innodb logfile,io壓力小,效能高,但可能損失資料;

②(1, default)每秒鐘和每次commit呼叫fsync()同步一次innodb logfile,保證資料完整的同時,加大了io壓力,吞吐量相對低;

③(2, default)速度介於前兩者之間,也不能完全保證資料的安全;

④(0,O_DSYNC)每秒同步日誌及資料檔案,吞吐量等情況應與(0, default)基本一致;

⑤(1,O_DSYNC)每秒鐘和每次commit同步資料及日誌檔案,相應於(1, default)情況一致;

⑥(2,O_DSYNC)雖然innodb_flush_log_at_trx_commit設定為2,innodb被告知每次事務提交引起寫入 日誌檔案的動作,每秒鐘完成一次flush磁碟操作,但由於O_DSYNC的設定使得os對日誌自動做了同步工作,所以吞吐量等情況與(1, default)和(1,O_DSYNC)相一致。[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7916042/viewspace-1056696/,如需轉載,請註明出處,否則將追究法律責任。

相關文章