gpt4 book ai didi

c - 为什么使用 fsync() 刷新写入磁盘可以加快访问速度?

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:01 24 4
gpt4 key购买 nike

我们需要一个应用程序尽可能地保证当它报告记录时确实存在。我知道要执行此操作,您需要使用 fsync(fd)。然而,由于某些奇怪的原因,使用 fsync() 似乎加快了写入磁盘的代码,而不是像人们预期的那样减慢它的速度。

一些示例测试代码返回以下结果:

no sync() seconds:0.013388   writes per second:0.000001 
sync() seconds:0.006268 writes per second:0.000002

下面是产生这些结果的代码:

#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>

void withSync() {
int f = open( "/tmp/t8" , O_RDWR | O_CREAT );
lseek (f, 0, SEEK_SET );
int records = 10*1000;
clock_t ustart = clock();
for(int i = 0; i < records; i++) {
write(f, "012345678901234567890123456789" , 30);
fsync(f);
}
clock_t uend = clock();
close (f);
printf(" sync() seconds:%lf writes per second:%lf\n", ((double)(uend-ustart))/(CLOCKS_PER_SEC), ((double)records)/((double)(uend-ustart))/(CLOCKS_PER_SEC));
}

void withoutSync() {
int f = open( "/tmp/t10" , O_RDWR | O_CREAT );
lseek (f, 0, SEEK_SET );
int records = 10*1000;
clock_t ustart = clock();
for(int i = 0; i < records; i++) {
write(f, "012345678901234567890123456789" , 30 );
}
clock_t uend = clock();
close (f);
printf("no sync() seconds:%lf writes per second:%lf \n", ((double)(uend-ustart))/(CLOCKS_PER_SEC), ((double)records)/((double)(uend-ustart))/(CLOCKS_PER_SEC));
}

int main(int argc, const char * argv[])
{
withoutSync();
withSync();
return 0;
}

最佳答案

问题在于您尝试为 I/O 写入计时的方式。您在语义上想要测量 I/O 记录写入之间的挂钟时间,但您使用的是 C 库函数 clock,它测量 CPU 执行时间而不是总时间过去。将 clock_gettime 与时钟选择 CLOCK_MONOTONIC 一起使用,或者理想情况下,CLOCK_MONOTONIC_RAW(后者是 Linux 扩展)。

您不是在收集调用 clock 之间经过的总时间:您是在收集进程旋转 CPU 周期的时间量的估计值。您的磁盘 I/O(具体来说,对 writefsync 的调用)是阻塞的,这意味着每个系统调用都由内核代表您处理,并且不会在您的进程上下文中消耗 CPU。因此,您需要测量 wall-clock time 的实际差异,这听起来是真实世界中经过的总时间,超出了您的测试程序进程的范围。实际上,您根本不关心 fsync 的 CPU 时间。大多数 I/O 操作的执行时间不会被内核甚至 CPU 处理;这将是由于磁盘 Controller 。

此外,较小的记录大小也可以作为基准。这是同步 I/O 的常见用例(例如,为事务日志写入元数据)。要获得较大记录大小的时序稳定性,只需显着增加每个计时器间隔和平均/摊销的循环迭代次数。这将准确地模拟同步写入和刷新的小阻塞记录的成本。

请考虑使用 fdatasync 来提高性能。

关于c - 为什么使用 fsync() 刷新写入磁盘可以加快访问速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13337215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com