九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
linux 同步IO: sync、fsync與fdatasync

傳統(tǒng)的UNIX實現(xiàn)在內(nèi)核中設有緩沖區(qū)高速緩存或頁面高速緩存,大多數(shù)磁盤I/O都通過緩沖進行。當將數(shù)據(jù)寫入文件時,內(nèi)核通常先將該數(shù)據(jù)復制到其中一個緩沖區(qū)中,如果該緩沖區(qū)尚未寫滿,則并不將其排入輸出隊列,而是等待其寫滿或者當內(nèi)核需要重用該緩沖區(qū)以便存放其他磁盤塊數(shù)據(jù)時,再將該緩沖排入輸出隊列,然后待其到達隊首時,才進行實際的I/O操作。這種輸出方式被稱為延遲寫(delayed write)(Bach [1986]第3章詳細討論了緩沖區(qū)高速緩存)。
延遲寫減少了磁盤讀寫次數(shù),但是卻降低了文件內(nèi)容的更新速度,使得欲寫到文件中的數(shù)據(jù)在一段時間內(nèi)并沒有寫到磁盤上。當系統(tǒng)發(fā)生故障時,這種延遲可能造成文件更新內(nèi)容的丟失。為了保證磁盤上實際文件系統(tǒng)與緩沖區(qū)高速緩存中內(nèi)容的一致性,UNIX系統(tǒng)提供了sync、fsync和fdatasync三個函數(shù)。
sync函數(shù)只是將所有修改過的塊緩沖區(qū)排入寫隊列,然后就返回,它并不等待實際寫磁盤操作結(jié)束。
通常稱為update的系統(tǒng)守護進程會周期性地(一般每隔30秒)調(diào)用sync函數(shù)。這就保證了定期沖洗內(nèi)核的塊緩沖區(qū)。命令sync(1)也調(diào)用sync函數(shù)。
fsync函數(shù)只對由文件描述符filedes指定的單一文件起作用,并且等待寫磁盤操作結(jié)束,然后返回。fsync可用于數(shù)據(jù)庫這樣的應用程序,這種應用程序需要確保將修改過的塊立即寫到磁盤上。
fdatasync函數(shù)類似于fsync,但它只影響文件的數(shù)據(jù)部分。而除數(shù)據(jù)外,fsync還會同步更新文件的屬性。

于提供事務支持的數(shù)據(jù)庫,在事務提交時,都要確保事務日志(包含該事務所有的修改操作以及一個提交記錄)完全寫到硬盤上,才認定事務提交成功并返回給應用層。

一個簡單的問題:在*nix操作系統(tǒng)上,怎樣保證對文件的更新內(nèi)容成功持久化到硬盤?

1.  write不夠,需要fsync

一般情況下,對硬盤(或者其他持久存儲設備)文件的write操作,更新的只是內(nèi)存中的頁緩存(page cache),而臟頁面不會立即更新到硬盤中,而是由操作系統(tǒng)統(tǒng)一調(diào)度,如由專門的flusher內(nèi)核線程在滿足一定條件時(如一定時間間隔、內(nèi)存中的臟頁達到一定比例)內(nèi)將臟頁面同步到硬盤上(放入設備的IO請求隊列)。
因為write調(diào)用不會等到硬盤IO完成之后才返回,因此如果OS在write調(diào)用之后、硬盤同步之前崩潰,則數(shù)據(jù)可能丟失。雖然這樣的時間窗口很小,但是對于需要保證事務的持久化(durability)和一致性(consistency)的數(shù)據(jù)庫程序來說,write()所提供的“松散的異步語義”是不夠的,通常需要OS提供的同步IO(synchronized-IO)原語來保證:
1 #include <unistd.h>2 int fsync(int fd);
fsync的功能是確保文件fd所有已修改的內(nèi)容已經(jīng)正確同步到硬盤上,該調(diào)用會阻塞等待直到設備報告IO完成。
 
 
PS:如果采用內(nèi)存映射文件的方式進行文件IO(使用mmap,將文件的page cache直接映射到進程的地址空間,通過寫內(nèi)存的方式修改文件),也有類似的系統(tǒng)調(diào)用來確保修改的內(nèi)容完全同步到硬盤之上:
1 #incude <sys/mman.h>
2 int msync(void *addr, size_t length, int flags)

msync需要指定同步的地址區(qū)間,如此細粒度的控制似乎比fsync更加高效(因為應用程序通常知道自己的臟頁位置),但實際上(Linux)kernel中有著十分高效的數(shù)據(jù)結(jié)構(gòu),能夠很快地找出文件的臟頁,使得fsync只會同步文件的修改內(nèi)容。

 

2. fsync的性能問題,與fdatasync

除了同步文件的修改內(nèi)容(臟頁),fsync還會同步文件的描述信息(metadata,包括size、訪問時間st_atime & st_mtime等等),因為文件的數(shù)據(jù)和metadata通常存在硬盤的不同地方,因此fsync至少需要兩次IO寫操作,fsync的man page這樣說:

"Unfortunately fsync() will always initialize two write operations : one for the newly written data and another one in order to update the modification time stored in the inode. If the modification time is not a part of the transaction concept fdatasync() can be used to avoid unnecessary inode disk write operations."

多余的一次IO操作,有多么昂貴呢?根據(jù)Wikipedia的數(shù)據(jù),當前硬盤驅(qū)動的平均尋道時間(Average seek time)大約是3~15ms,7200RPM硬盤的平均旋轉(zhuǎn)延遲(Average rotational latency)大約為4ms,因此一次IO操作的耗時大約為10ms左右。這個數(shù)字意味著什么?下文還會提到。

 

Posix同樣定義了fdatasync,放寬了同步的語義以提高性能:

1 #include <unistd.h>2 int fdatasync(int fd);
fdatasync的功能與fsync類似,但是僅僅在必要的情況下才會同步metadata,因此可以減少一次IO寫操作。那么,什么是“必要的情況”呢?根據(jù)man page中的解釋:
"fdatasync does not flush modified metadata unless that metadata is needed in order to allow a subsequent data retrieval to be corretly handled."
舉例來說,文件的尺寸(st_size)如果變化,是需要立即同步的,否則OS一旦崩潰,即使文件的數(shù)據(jù)部分已同步,由于metadata沒有同步,依然讀不到修改的內(nèi)容。而最后訪問時間(atime)/修改時間(mtime)是不需要每次都同步的,只要應用程序?qū)@兩個時間戳沒有苛刻的要求,基本無傷大雅。
 
 
PS:open時的參數(shù)O_SYNC/O_DSYNC有著和fsync/fdatasync類似的語義:使每次write都會阻塞等待硬盤IO完成。(實際上,Linux對O_SYNC/O_DSYNC做了相同處理,沒有滿足Posix的要求,而是都實現(xiàn)了fdatasync的語義)相對于fsync/fdatasync,這樣的設置不夠靈活,應該很少使用。
 
 

3. 使用fdatasync優(yōu)化日志同步

文章開頭時已提到,為了滿足事務要求,數(shù)據(jù)庫的日志文件是常常需要同步IO的。由于需要同步等待硬盤IO完成,所以事務的提交操作常常十分耗時,成為性能的瓶頸。
在Berkeley DB下,如果開啟了AUTO_COMMIT(所有獨立的寫操作自動具有事務語義)并使用默認的同步級別(日志完全同步到硬盤才返回),寫一條記錄的耗時大約為5~10ms級別,基本和一次IO操作(10ms)的耗時相同。
 我們已經(jīng)知道,在同步上fsync是低效的。但是如果需要使用fdatasync減少對metadata的更新,則需要確保文件的尺寸在write前后沒有發(fā)生變化。日志文件天生是追加型(append-only)的,總是在不斷增大,似乎很難利用好fdatasync。
 
且看Berkeley DB是怎樣處理日志文件的:
1.每個log文件固定為10MB大小,從1開始編號,名稱格式為“l(fā)og.%010d"
2.每次log文件創(chuàng)建時,先寫文件的最后1個page,將log文件擴展為10MB大小
3.向log文件中追加記錄時,由于文件的尺寸不發(fā)生變化,使用fdatasync可以大大優(yōu)化寫log的效率
4.如果一個log文件寫滿了,則新建一個log文件,也只有一次同步metadata的開銷

 


本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
同步內(nèi)核緩沖區(qū)sync、fsync和fdatasync函數(shù)
緩沖還是不緩沖?這是個問題
ext4 mount option data mode: journal ordered write
正確的使用dd進行磁盤讀寫速度測試
文件系統(tǒng)I/O與mysql相關(guān)參數(shù)關(guān)系
IO的過程
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服