Linux 在多个文件上调用fsync而不是在一个文件上调用fsync时的性能

Linux 在多个文件上调用fsync而不是在一个文件上调用fsync时的性能,linux,performance,filesystems,performance-testing,fsync,Linux,Performance,Filesystems,Performance Testing,Fsync,我有多个线程,每个线程接受请求,进行一些处理,将结果存储在提交日志中,然后返回结果。为了保证丢失最多x秒的数据,此提交日志需要每x秒进行一次fsync 我希望避免线程之间的同步,这意味着每个线程都需要有自己的提交日志,而不是共享日志—是否可以以性能良好的方式定期同步所有这些不同的提交日志 这是在Linux、ext4(或ext3)上实现的 (注意:由于代码的性质,即使在正常处理过程中,线程也需要从提交日志中重新读取它们自己的一些最新数据(但决不需要其他线程提交日志数据),因此我认为使用共享日志是不

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

我希望避免线程之间的同步,这意味着每个线程都需要有自己的提交日志,而不是共享日志—是否可以以性能良好的方式定期同步所有这些不同的提交日志

这是在Linux、ext4(或ext3)上实现的


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

如果只需要每隔几秒钟刷新一次,是否需要fsync()?也就是说,操作系统应该定期为您执行此操作(除非系统负载过重且磁盘I/O短缺)

否则,让线程执行以下操作:

if (high_resolution_time() % n == 0) {
  fsync();
}
其中,n是一个值,例如,如果high_resolution_time()返回Unix历元时间(以秒表示),则该值将为3。将使线程每3秒刷新一次文件

当然,问题是您需要更高的时钟分辨率,以避免线程每秒多次通过此代码段,而不是快速连续多次刷新其文件。我不知道您使用的是什么编程语言,但在Linux上的C语言中您可以使用 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();
}