本篇文章主要是教大家如何在linux系統裡對資料庫及裝置io庫進行調優,相信對於linux的初學者來說會有很大的幫助!
資料庫系統是基於檔案系統的,其效能和裝置讀寫的機制有密切的關係。和資料庫效能密切相關的檔案i/o操作的三個操作:
open
開啟檔案
write
寫檔案fdatasync
flush操作(將檔案快取刷到磁碟上)。
一、open操作
1. o_wronly表示我們以"寫"的方式開啟,告訴核心我們需要向檔案中寫入資料;
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開啟檔案,則讀/寫操作都會跳過oscache,直接在device(disk)上讀/寫。因為沒有了oscache,所以會o_direct降低檔案的順序讀寫的效率。
二、write操作
write(fd,buf,6)在使用open開啟檔案獲得檔案描述符之後,我們就可以呼叫write函式來寫入資料了,write會根據前面的open引數不同,而表現不同。
三、flush階段
fdatasync(fd) == -1write操作後,我們還呼叫了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如下:
library buffer是標準庫提供的使用者空間的buffer,可以通過setvbuf改變其大小。
第二類是使用linux的系統呼叫的open/read/write 系列的函式,我們可以稱其為 non-bufferedi/o。
此外,我們可以通過設定open的o_direct 標誌來實現direct i/o (或者叫raw i/o ),即繞過oscache,直接讀取device ( that's what we want^o^ ), 等於將oscache換成自己管理的cache。不過,linus在郵件列表中建議不這麼做,而是使用posix_fadvice,madvice。中表明direct i/o比buffered i/o的效能高很多。
在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需要謹慎。
mysql
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需要謹慎。
資料庫配置I O
1 oracle支援的儲存型別 file system,asm automatic storage management 2 i o statistics檢視 v filestat,v tempstat,v datafile 3 檢視資料檔案i o讀寫 sql select phyrds,phywr...
資料庫IO簡介
io有四種型別 連續讀,隨機讀,隨機寫和連續寫,連續讀寫的io size通常比較大 128kb 1mb 主要衡量吞吐量,而隨機讀寫的io size比較小 小於8kb 主要衡量iops和響應時間。資料庫中的全表掃瞄是連續讀io,索引訪問則是典型的隨機讀io,日誌檔案是連續寫io,而資料檔案則是隨機寫i...
Linux裝置驅動之阻塞I O與非同步通知
阻塞與非阻塞訪問是 i o 操作的兩種不同模式,前者在 i o 操作暫時不可進行時會讓程序睡眠,後者則不然。在裝置驅動中阻塞 i o一般基於等待佇列來實現,等待佇列可用於同步驅動中事件發生的先後順序。使用非阻塞 i o 的應用程式也可借助輪詢函式來查詢裝置是否能立即被訪問,使用者空間呼叫 selec...