[英]How much time sync() can take at max?
sync()导致对文件系统元数据和缓存的文件数据的所有未决修改被写入基础文件系统。 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分钟内没有返回。 这是有效的行为吗?
任何帮助将不胜感激。
最大永远。 例如,等待写入断开的NFS共享的数据。
POSIX说:
尽管已安排了编写,但从sync()返回时不一定完成编写。
这意味着通常sync()
仅调度刷新,而不等待其完成。 因此sync()
几乎是异步的,它返回的事实并不意味着已完成刷新。 sync()
调用消耗的时间与基础刷新之间没有关系。 您都将无法知道刷新是否成功/终止。
sync()
执行所花费的时间没有固定的上限。 它的任务是将缓冲区高速缓存中的页面修改同步到基础文件系统。 花费的时间取决于(除其他因素外):要同步多少数据,以及承载基础文件系统的设备有多慢(例如,考虑写入速度非常低的USB记忆棒)。 在极端情况下,这可能需要数十分钟,甚至数小时。
接受的答案引用了POSIX的以下详细信息:
尽管已安排了编写,但从sync()返回时不一定完成编写。
但随后将其解释为:
这意味着通常
sync()
仅调度刷新,而不等待其完成。
我认为这会误解POSIX以及现有实现的性质。 在大多数现有的(也许是所有现代的)实现中, sync()
阻塞,直到所有数据都已同步到存储设备。 因此,通过sync()
返回的时间,应用程序知道数据已到达底层存储。
但是,POSIX规范还允许使用另一种实现方式:内核仅调度同步操作以异步发生,并立即从sync()
调用返回。 这显然比阻止sync()
实现要有用,因为执行同步操作的应用程序通常希望知道数据何时到达底层设备。 在具有“异步” sync()
,应用程序无法确定何时将数据降落到存储设备上。
POSIX允许任何一种实现方式,大概是因为在API标准化时,某些现有实现提供了较弱的异步sync()
实现,而在这种情况下,通常的POSIX方法是将其标准化为最低公分母。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.