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/n/228761.html