fdatasync()是Linux的一個系統調用,用於將文件緩存中的數據以及對於該文件的元數據刷到磁碟中。本文將從多個方面對fdatasync做詳細的闡述。
一、fdatasync dd
dd(磁碟讀寫命令)是Linux系統中一個非常常用的工具,它可以實現磁碟的讀寫操作。而fdatasync也是一個磁碟讀寫命令,它除了能夠刷寫數據外,還可以刷寫文件的元數據。下面是fdatasync和dd的對比實驗:
$ dd if=/dev/zero of=test.data bs=1k count=1024k 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.36639 s, 786 MB/s $ fdatasync test.data
可以看到,dd命令可以快速寫入1GB的數據,而fdatasync命令只是將test.data文件的數據和元數據都刷寫到磁碟中,沒有寫入任何數據。
二、fdatasync emmc
在使用ARM開發板的過程中,我們經常會遇到文件系統存儲在EMMC快閃記憶體上的情況,而fdatasync也正適用於EMMC的讀寫操作。下面是一個基於emmc存儲讀寫測試的實驗:
$ dd if=/dev/zero of=test.data bs=1k count=1024k 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 19.5795 s, 54.9 MB/s $ fdatasync test.data
可以看到,dd命令可以快速寫入1GB的數據,而fdatasync命令只是將test.data文件的數據和元數據都刷寫到磁碟中,沒有寫入任何數據。
三、fdatasync函數
fdatasync函數的代碼示例如下:
#include int fdatasync(int fd);
其中,fd表示文件描述符
fdatasync函數將文件緩存中的數據和對於該文件的元數據都刷寫到磁碟中,該函數是標準C99所定義的機制之一。fdatasync函數與fsync函數的區別在於,fdatasync函數只同步文件中的數據和元數據,不同步文件系統元數據。
四、fdatasync 性能差異
fdatasync命令和函數相比,性能上會有一定的差異。下面是兩者性能的對比實驗:
1) 基於fdatasync函數的性能測試:
#include #include #include void main() { int fd; clock_t tstart,tend; char string[50] = "fdatasync_test"; fd = open(string, O_RDWR | O_CREAT); tstart = clock(); fdatasync(fd); tend = clock(); printf("Time taken by fdatasync : %f seconds\n", (double)(tend - tstart) / CLOCKS_PER_SEC); close(fd); }
2) 基於fdatasync命令的性能測試:
$ dd if=/dev/zero of=test.data bs=1k count=1024k 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.29912 s, 250 MB/s $ fdatasync test.data
可以看到,基於fdatasync函數的性能測試耗時較短,但寫入的數據量較少;而基於fdatasync命令的性能測試耗時較長,但寫入的數據量較大。
五、fdatasync iops
在進行IOPS(每秒輸入/輸出操作數)性能測試的時候,fdatasync命令和函數也會有一定的差異。下面是一個基於fdatasync iops的實驗:
$ time fdatasync test.data real 0m5.287s user 0m0.000s sys 0m2.416s
可以看到,fdatasync命令的實驗結果為5.287s,其中sys部分為2.416s,表示在fdatasync命令執行的過程中,有2.416s的時間用於系統調用。
六、fdatasync 硬體關係
fdatasync命令和函數在執行時,也會受到硬體配置的影響。下面是一個基於硬碟的fdatasync實驗:
$ time fdatasync test.hdd real 0m58.850s user 0m0.000s sys 0m0.011s
可以看到,在基於硬碟的fdatasync測試中,所用的時間為0.058850s,其中sys部分只有0.011s。說明硬碟的性能較低。
七、fdatasync fsync
在Linux系統中,fsync函數和fdatasync函數都可以用於將文件緩存中的數據和對於該文件的元數據刷寫到磁碟中。但是與fdatasync不同的是,fsync函數會讓文件緩存中的所有數據都被寫到磁碟中,而不僅僅是對於該文件而言的。fdatasync函數只同步文件中的數據和元數據,不同步文件系統元數據。
八、fdatasync failed
fdatasync函數和命令在執行過程中,也會受到文件讀寫許可權等因素的影響。下面是一個fdatasync failed的實驗:
$ fdatasync /root/test.data fdatasync: failed to write file data: Permission denied
可以看到,當執行fdatasync命令時,由於文件讀寫許可權不足,因此導致fdatasync命令失敗。
九、fdatasync後修改別的文件
fdatasync函數和命令在執行過程中,也允許用戶在調用fdatasync之後修改其他文件。下面是一個fdatasync後修改別的文件的實驗:
$ dd if=/dev/zero of=test.data bs=1k count=1024k 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.08008 s, 211 MB/s $ fdatasync test.data $ echo "hello world" > otherfile.txt
可以看到,當先執行fdatasync命令寫入數據後,再修改另外的文件,不會對fdatasync命令產生影響。
總結
fdatasync是Linux系統中一個非常有用的磁碟讀寫命令,可以用於將文件緩存中的數據以及對於該文件的元數據刷到磁碟中。本文從多個方面對fdatasync做了詳細的闡述,包括fdatasync命令和函數的基本功能、性能差異、硬體關係等。對於需要進行文件讀寫方面的開發或者維護的工程師來說,fdatasync是一個值得掌握和深入理解的重要工具。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/228761.html