共計 2573 個字符,預計需要花費 7 分鐘才能閱讀完成。
本篇文章給大家分享的是有關如何進行 Linux 設備 IO 研究與數據庫性能調優,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。
如何在 Linux 系統里對數據庫及設備 IO 庫進行調優?
數據庫系統是基于文件系統的,其性能和設備讀寫的機制有密切的關系。和數據庫性能密切相關的文件 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。
(1) O_SYNC 比 O_DSYNC 更嚴格,不僅要求數據已經寫到了磁盤,而且對應的數據文件的屬性(例如文件長度等)也需要更新完成才算 write 操作成功??梢?O_SYNC 較之 O_DSYNC 要多做一些操作。
(2) 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 中的數據排入寫隊列,并不確認是否真的寫磁盤了,所以 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。
Application - Operation System Cache - File System/Volume Manager - Device
此外,我們可以通過設置 open 的 O_DIRECT 標志來實現 Direct I/O(或者叫 Raw I/O), 即繞過 OS Cache, 直接讀取 Device (that s what we want^o^), 等于將 OS cache 換成自己管理的 cache。不過,Linus 在郵件列表中建議不這么做,而是使用 posix_fadvice, madvice。中表明 Direct I/ O 比 buffered I/ O 的性能高很多。
在 MySQL 中,參數 Innodb_flush_method(Linux) 可以設定為:Fdatasync、O_DSYNC、O_DIRECT。我們看看這個三個參數是如何影響程序 MySQL 對日志和數據文件的操作:
Open logFlush logOpen datafileFlush dataFdatasync
fsync()
fsync()O_DSYNCO_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 需要謹慎。
mysql innodb 對應相關參數:
innodb_flush_method 有三個值,分別是 fdatasync,O_DSYNC 和 O_DIRECT,其中 fdatasync 是默認值。
它們控制了 InnoDB 刷新日志和數據的模式。
fdatasync:InnoDB 使用 fsync() 函數去更新日志和數據文件。
O_DSYNC:InnoDB 使用 O_SYNC 模式打開并更新日志文件,用 fsync() 函數去更新數據文件。
O_DIRECT:InnoDB 使用 O_DIRECT 模式打開數據文件,用 fsync() 函數去更新日志和數據文件。
我們看到 O_DIRECT 和 fdatasync 和很類似,但是它會使用 O_DIRECT 來打開數據文件。有數據表明,如果是大量隨機寫入操作,O_DIRECT 會提升效率。但是順序寫入和讀取效率都會降低。所以使用 O_DIRECT 需要謹慎。
以上就是如何進行 Linux 設備 IO 研究與數據庫性能調優,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業資訊頻道。