【问题标题】:Performance when calling fsync on multiple files vs one file在多个文件与一个文件上调用 fsync 时的性能
【发布时间】:2015-01-21 02:26:15
【问题描述】:
我有多个线程,每个线程都接受请求,进行一些处理,将结果存储在提交日志中,然后返回结果。为了保证最多丢失 x 秒的数据,这个提交日志需要每 x 秒 fsync 一次。
我想避免线程之间的同步,这意味着它们每个都需要有自己的提交日志而不是共享日志 - 是否可以以高效的方式定期同步所有这些不同的提交日志?
这是在 Linux、ext4(或 ext3)上
(注意:由于代码的性质,即使在正常处理期间,线程也需要从提交日志中重新读取一些自己的最新数据(但从不其他线程提交日志数据),所以我相信它会使用共享日志是不切实际的,因为许多线程需要读取/写入它)
【问题讨论】:
标签:
linux
performance
filesystems
performance-testing
fsync
【解决方案1】:
如果您只需要每隔几秒刷新一次,您是否需要 fsync() ? IE。操作系统应该定期为您执行此操作(除非系统负载过重且磁盘 I/O 供应不足)。
否则,让您的线程执行以下操作:
if (high_resolution_time() % n == 0) {
fsync();
}
其中 n 是一个值,例如3 如果 high_resolution_time() 返回,则返回 Unix EPOCH 时间(以秒为单位)。将使线程每 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();
}