日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux同步IO: sync、fsync与fdatasync

發布時間:2024/1/23 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux同步IO: sync、fsync与fdatasync 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載地址:https://blog.csdn.net/cywosp/article/details/8767327

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

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

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

1. ?write不夠,需要fsync

一般情況下,對硬盤(或者其他持久存儲設備)文件的write操作,更新的只是內存中的頁緩存(page cache),而臟頁面不會立即更新到硬盤中,而是由操作系統統一調度,如由專門的flusher內核線程在滿足一定條件時(如一定時間間隔、內存中的臟頁達到一定比例)內將臟頁面同步到硬盤上(放入設備的IO請求隊列)。

因為write調用不會等到硬盤IO完成之后才返回,因此如果OS在write調用之后、硬盤同步之前崩潰,則數據可能丟失。雖然這樣的時間窗口很小,但是對于需要保證事務的持久化(durability)和一致性(consistency)的數據庫程序來說,write()所提供的“松散的異步語義”是不夠的,通常需要OS提供的同步IO(synchronized-IO)原語來保證:

1 #include <unistd.h> 2 int fsync(int fd);

fsync的功能是確保文件fd所有已修改的內容已經正確同步到硬盤上,該調用會阻塞等待直到設備報告IO完成。

PS:如果采用內存映射文件的方式進行文件IO(使用mmap,將文件的page cache直接映射到進程的地址空間,通過寫內存的方式修改文件),也有類似的系統調用來確保修改的內容完全同步到硬盤之上:

1 #incude <sys/mman.h> 2 int msync(void *addr, size_t length, int flags)

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

2. fsync的性能問題,與fdatasync

除了同步文件的修改內容(臟頁),fsync還會同步文件的描述信息(metadata,包括size、訪問時間st_atime & st_mtime等等),因為文件的數據和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操作,有多么昂貴呢?根據Wikipedia的數據,當前硬盤驅動的平均尋道時間(Average seek time)大約是3~15ms,7200RPM硬盤的平均旋轉延遲(Average rotational latency)大約為4ms,因此一次IO操作的耗時大約為10ms左右。這個數字意味著什么?下文還會提到。

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

1 #include <unistd.h> 2 int fdatasync(int fd);

fdatasync的功能與fsync類似,但是僅僅在必要的情況下才會同步metadata,因此可以減少一次IO寫操作。那么,什么是“必要的情況”呢?根據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一旦崩潰,即使文件的數據部分已同步,由于metadata沒有同步,依然讀不到修改的內容。而最后訪問時間(atime)/修改時間(mtime)是不需要每次都同步的,只要應用程序對這兩個時間戳沒有苛刻的要求,基本無傷大雅。

PS:open時的參數O_SYNC/O_DSYNC有著和fsync/fdatasync類似的語義:使每次write都會阻塞等待硬盤IO完成。(實際上,Linux對O_SYNC/O_DSYNC做了相同處理,沒有滿足Posix的要求,而是都實現了fdatasync的語義)相對于fsync/fdatasync,這樣的設置不夠靈活,應該很少使用。

3. 使用fdatasync優化日志同步

文章開頭時已提到,為了滿足事務要求,數據庫的日志文件是常常需要同步IO的。由于需要同步等待硬盤IO完成,所以事務的提交操作常常十分耗時,成為性能的瓶頸。

在Berkeley DB下,如果開啟了AUTO_COMMIT(所有獨立的寫操作自動具有事務語義)并使用默認的同步級別(日志完全同步到硬盤才返回),寫一條記錄的耗時大約為5~10ms級別,基本和一次IO操作(10ms)的耗時相同。

?我們已經知道,在同步上fsync是低效的。但是如果需要使用fdatasync減少對metadata的更新,則需要確保文件的尺寸在write前后沒有發生變化。日志文件天生是追加型(append-only)的,總是在不斷增大,似乎很難利用好fdatasync。

且看Berkeley DB是怎樣處理日志文件的:

1.每個log文件固定為10MB大小,從1開始編號,名稱格式為“log.%010d"

2.每次log文件創建時,先寫文件的最后1個page,將log文件擴展為10MB大小

3.向log文件中追加記錄時,由于文件的尺寸不發生變化,使用fdatasync可以大大優化寫log的效率

4.如果一個log文件寫滿了,則新建一個log文件,也只有一次同步metadata的開銷

總結

以上是生活随笔為你收集整理的linux同步IO: sync、fsync与fdatasync的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 大香伊人久久 | 一区二区三区波多野结衣 | 一本一道无码中文字幕精品热 | 岛国av网站| 丰满av| 欧美一区二区三区影视 | 亚洲色成人网站www永久四虎 | 男女超爽视频免费播放 | 国产三级三级在线观看 | 国产人妻大战黑人20p | 五月婷婷视频在线观看 | 久久99精品久久只有精品 | 国产精品久久久一区 | h毛片| 女同av网站| 91精品国产自产精品男人的天堂 | 国产一级片毛片 | 久热超碰 | 久久久久一 | 热玖玖 | 嫩草影院在线免费观看 | 538精品一线 | 新91在线| 午夜亚洲 | 91精品国产一区二区三区 | 国产思思 | 大尺度床戏揉捏胸视频 | 久久久青青 | 中文字幕一区二区人妻痴汉电车 | 国产又黄又大又粗的视频 | 国产黄色免费大片 | 天天躁日日躁狠狠躁av麻豆 | 下面一进一出好爽视频 | 精品人妻一区二区三区四区不卡 | 奇米亚洲 | 114国产精品久久免费观看 | 天天摸日日摸 | 日本高清免费不卡视频 | 一级v片 | 色哟哟视频在线 | www.av在线视频 | 日韩av在线一区 | 久久嫩 | 免费小视频 | 丰满人妻一区二区三区53视频 | 黄色美女视频网站 | 伊人精品综合 | 夜夜夜操操操 | 亚洲综合色在线观看 | 国产精品久久伊人 | av一区三区 | 国产综合一区二区 | 伊人久久视频 | www.国产91 | 亚洲午夜一区二区 | 亚洲日本成人在线观看 | 亚洲美女网站 | 91视频综合网 | 午夜一区不卡 | 在线免费av网 | 亚洲色图影院 | 国产乱人对白 | 茄子av在线 | 国产精品系列在线播放 | www.天天干.com | av少妇 | 天天综合网入口 | 久久窝窝 | 午夜手机福利 | 国内成人精品视频 | 色先锋在线 | 日韩一区二区在线免费观看 | 成人免费av片 | 91爱爱视频 | 国产高清一区在线 | 国产精品刘玥久久一区 | 2020国产精品| 日本免费一区二区三区四区五六区 | 久久99久 | 涩涩涩涩涩涩涩涩涩 | 日本三级免费看 | 国产日韩视频在线观看 | 久久一区欧美 | 免费观看视频一区 | 一区二区三区视频 | 日韩伦理视频 | 国产精品久久久免费视频 | 丝袜熟女一区二区 | 夜夜操国产 | 亚洲爱爱视频 | 你懂的视频网站 | 欧美激情偷拍 | 欧美女优在线观看 | 91在线免费看片 | 国产情侣露脸自拍 | 最近中文字幕在线中文高清版 | 欧美国产日韩在线观看成人 | 无人在线观看高清视频 单曲 | 浪漫樱花动漫在线观看免费 |