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

时间:2015-01-21 02:26:15

标签: linux performance filesystems performance-testing fsync

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

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

这是在Linux,ext4(或ext3)

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

1 个答案:

答案 0 :(得分: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();
}