1

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

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

这是在 Linux、ext4(或 ext3)上

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

4

1 回答 1

0

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

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

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

如果 high_resolution_time() 返回返回的 Unix EPOCH 时间(以秒为单位),则 n 是一个值,例如 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();
}
于 2015-01-22T08:48:36.200 回答