fsync的性能問題,與fdatasync

1、sync函數

sync函數只是將所有修改過的塊緩衝區排入寫隊列,然後就返回,它並不等待實際寫磁盤操作結束。
通常稱爲update的系統守護進程會週期性地(一般每隔30秒)調用sync函數。這就保證了定期沖洗內核的塊緩衝區。命令sync(1)也調用sync函數。
2、fsync函數
fsync函數只對由文件描述符filedes指定的單一文件起作用,並且等待寫磁盤操作結束,然後返回。
fsync可用於數據庫這樣的應用程序,這種應用程序需要確保將修改過的塊立即寫到磁盤上。
3、fdatasync函數
fdatasync函數類似於fsync,但它隻影響文件的數據部分。而除數據外,fsync還會同步更新文件的屬性。
對於提供事務支持的數據庫,在事務提交時,都要確保事務日誌(包含該事務所有的修改操作以及一個提交記錄)完全寫到硬盤上,才認定事務提交成功並返回給應用層。

4、fflush:標準IO函數(如fread,fwrite等)會在內存中建立緩衝,該函數刷新內存緩衝,將內容寫入內核緩衝,要想將其真正寫入磁盤,還需要調用fsync。(即先調用fflush然後再調用fsync,否則不會起作用)。fflush以指定的文件流描述符爲參數(對應以fopen等函數打開的文件流),僅僅是把上層緩衝區中的數據刷新到內核緩衝區就返回,

因此相對於fsync而言不是很安全,還需要再調用一下fsync來把數據真正寫入硬盤。



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."

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章