【发布时间】:2023-04-10 21:11:01
【问题描述】:
sync() 导致对文件系统元数据的所有挂起修改和 要写入底层文件系统的缓存文件数据。 sync() 总是成功的。
这意味着 sync() 仅在将所有数据同步到下划线后才会返回 文件系统。我想知道同步()所有数据需要多长时间? 最坏的情况是几分钟或几小时。
我不知道是什么参数定义了sync()时间。
我已经使用sync()创建了一个测试程序
#define _LARGEFILE64_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
char buffer[536870912];
int main(void)
{
int fd;
loff_t nr = 536870912;
int ret;
remove("./dummy");
errno = 0;
fd = open("./dummy", O_CREAT | O_NOFOLLOW | O_LARGEFILE | O_RDWR, 0700);
perror("open");
buffer[10] = 'a';
buffer[1024] = 'b';
buffer[10000] = 'c';
buffer[536870912 - 1000] = 'd';
buffer[536870912 - 2000] = 'e';
buffer[536870912 - 1] = 'f';
int i = 3;
while (i-- > 0) {
ret = write(fd, buffer, 536870912);
if (ret <= 0) {
perror("write");
return 1;
}
nr -= ret;
printf("sync start\n");
}
sync();
printf("sync done\n");
return 0;
}
它显示了 sync() 在多次迭代中所用的时间不均匀。
有时这个测试程序在 sync() 处甚至需要 30 分钟,即 sync() 在 30 分钟内不会返回。这是一种有效的行为吗?
任何帮助将不胜感激。
【问题讨论】:
-
当我将数 GB 的图像写入慢速 (4MB/秒) 拇指驱动器时,同步需要 10 分钟,因为内存中的缓冲区会慢慢耗尽。完成所有写入调用后,将 RAM 大小除以设备速度,这可能会给您一个上限。
-
如果你修改你的程序运行
fsync(fd)而不是sync(),它需要大约相同的时间吗? -
@MarkPlotnick 它显示了一些改进但不多。
-
是的,它们应该花费大约相同的时间。如果你想看看时间是否可以改进,你可以在 unix.stackexchange.com 上询问。
-
sync启动所有同步操作。然后返回 IE实际同步未完成。但是,sync在之前的同步完成之前不会再次运行。所以正确的方法是调用两次。在命令行上,它看起来像:`sync;同步;
标签: c linux operating-system system-calls