fsync的性能在Linux 2.6.32 ext2文件系统上得到了混合结果

时间:2014-07-31 02:49:30

标签: linux performance ext2 fsync

当我在我的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元数据。

0 个答案:

没有答案