2
  • 日记模式

data=journal 模式提供完整的数据和元数据日志。所有新数据首先写入日志,然后写入其最终位置。

如果发生崩溃,可以重播日志,使数据和元数据处于一致状态。这种模式是最慢的,除非需要同时从磁盘读取数据和将数据写入磁盘,它的性能优于所有其他模式。启用此模式将禁用延迟分配和 O_DIRECT 支持。

在这里我有几个问题,请看一下:

  1. 配置data=journal,然后用户调用write(),是数据写入journal成功后write()返回,还是进入pagecache后返回用户成功?如果是后者,就说明journal是异步提交的,那么ext4的journal的意义就是保证文件系统本身的一致性,不保证用户数据不会丢失?

  2. 如果ext4异步提交日志,什么时候触发日志?

  3. 是否有任何其他文件系统允许在 write() 成功返回之前同步日志?

根据我本地实验的结果,推断该期刊应该是异步提交的。我使用了一个单独的 ssd 分区作为 journal_dev。我用fio测试写文件的时候发现journal_dev的io是断断续续的,不是一直都有IO。

4

1 回答 1

1
  1. write() 将在进入页面缓存后返回用户成功(假设您没有在 上使用任何额外选项open())。
  2. 至少定期(参见commit=https://www.kernel.org/doc/Documentation/filesystems/ext4.txt 并且可能在任何未决sync/fsync等被允许完成之前。
  3. 否(否则它会破坏缓冲点)。

如果您要传递O_SYNCopen()执行附加操作,fsync您将了解您的写入何时进入内核所知道的稳定媒体。

于 2020-12-19T18:12:12.093 回答