首页 文章

在多个文件和一个文件上调用fsync时的性能

提问于
浏览
1

我有多个线程,每个线程接受请求,进行一些处理,将结果存储在提交日志中,并返回结果 . 为了保证最多x秒的数据丢失,此提交日志需要每隔x秒进行一次fsync .

我想避免线程之间的同步,这意味着它们每个都需要有自己的提交日志而不是共享日志 - 是否有可能以高效的方式定期fsync所有这些不同的提交日志?

这是在Linux,ext4(或ext3)上

(注意:由于代码的性质,即使在正常处理过程中,线程也需要从提交日志中重新读取一些自己的最新数据(但绝不会有其他线程提交日志数据),所以我认为这样做是不切实际的 . 使用共享日志,因为许多线程需要读/写它

1 回答

  • 0

    如果你每隔几秒钟只需要刷新一次,你需要fsync()吗?即操作系统应该定期为您执行此操作(除非系统负载过重且磁盘I / O供应不足) .

    否则,让你的线程做类似的事情:

    if (high_resolution_time() % n == 0) {
      fsync();
    }
    

    其中n是一个值,例如3如果high_resolution_time()返回返回Unix EPOCH时间(以秒表示) . 会让线程每隔3秒刷新一次文件 .

    当然,问题是您需要更高的时钟分辨率,以避免每秒多次通过此代码段的线程不能快速连续多次刷新其文件 . 我不知道你使用的是什么编程语言,但在C on Linux上你可以使用gettimeofday:

    struct timeval tv;
    gettimeofday(&tv, null);
    double x = (double)tv.tv_sec * (double)1000000 + (double)tv.tv_usec; 
    if (x % 3000000 == 0) {  // fsync every 3 seconds
      fsync();
    }
    

相关问题