当我在我的Linux机器上测试fsync的性能时,我发现fsync在将数据插入到增加文件的文件中时花费了很多时间,但是当插入仅覆盖exsting内容但不增长的数据时,它的执行速度提高了100倍文件的大小。
ENV: 2核,12核 Linux版本2.6.32_1-14-0-0(scmpf @ pwd)(gcc版本4.4.4 20100726(Red Hat 4.4.4-13)(GCC))#1 SMP Mon Mar 31 10:42:09 CST 2014 ext2文件系统
测试代码:
static int _openfile_w(char *file, bool is_sync)
{
int flag = O_CREAT|O_RDWR;
if (is_sync)
{
flag |= O_SYNC;
}
return open(file,flag,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
}
int test_fsync(void)
{
#define NUMOFFSYNC 1000
int fd = 0;
char * filename = "/home/zhangguangzhou/tmp/0";
fd = _openfile_w(filenames, false);
if (fd <= 0)
{
UB_LOG_WARNING("%s open index file %s error",__FUNCTION__, filename);
return -1;
}
char data[1024];
memset((void*)data, 'c', sizeof(data));
for( int i = 0; i < NUMOFFSYNC; i++)
{
if (lseek(fd, i*sizeof(data), SEEK_SET) < 0)
{
UB_LOG_WARNING("%s lseek index error, transid:curidx:%d",
__FUNCTION__, i);
return -1;
}
if (write(fd, data, sizeof(data)) != sizeof(data))
{
UB_LOG_WARNING("%s write index error, transid:curidx:%d",
__FUNCTION__, i);
return -1;
}
if (fsync(fd) < 0)
{
UB_LOG_WARNING("%s fsync error, cur_datano:%d",
__FUNCTION__, i);
return -1;
}
}
return 0;
}
结果:
在“echo”“&gt; / home / zhangguangzhou / tmp / 0”之后运行上面的test_fsync程序,它会对文件进行真空吸尘,每个fsync在平均上花费8ms。但是当重复运行时,它将花费50我们平均而言在第二次和以后的运行。当我从文件中间测试insertint数据或使用不同大小的数据插入时,结果几乎没有变化。
问题: 如果写入正在增加文件,fsync的额外时间会花费多少?
我考虑过fysnc中的inode IO,但inode IO对于文件增长写入和无文件增长写入都是相同的,因为它们都需要更新文件修改时间的inode元数据。