file - 文件系统写入缓冲区通常在几秒后被刷新?

标签 file file-io filesystems data-persistence

在覆盖文件中的数据之前,我想非常确定旧数据存储在磁盘上。它可能是一个非常大的文件(数 GB),因此需要就地更新。通常写入将是 2 MB 或更大(我的计划是使用 4 KB 的 block 大小)。

代替(或除此之外)调用 fsync(),我想保留(不覆盖)磁盘上的旧数据,直到文件系统写入新数据。我不想依赖 fsync() 的主要原因是:most hard disks lie to you about doing an fsync.

所以我正在寻找的是文件系统、操作系统(例如 Windows)、硬盘驱动器的典型最大延迟,直到数据写入磁盘,而不使用 fsync 或类似方法。如果可能的话,我想拥有真实世界的数字。我不是在寻找使用 fsync 的建议。

我知道没有 100% 可靠的方法可以做到这一点,但我想更好地了解操作系统和文件系统在这方面是如何工作的。

到目前为止我发现的是:30 seconds is / was the default for /proc/sys/vm/dirty_expire_centiseconds .然后“dirty pages are flushed (written) to disk ... (when) too much time has elapsed since a page has stayed dirty”(但我找不到默认时间)。所以对于 Linux,40 秒似乎是安全的。但这适用于所有文件系统/磁盘吗? Windows、Android 等呢?我想得到一个适用于所有常见操作系统/文件系统/磁盘类型的答案,包括 Windows、Android、普通硬盘、SSD 等。

最佳答案

为用户提供响应式系统涉及很多缓存。

有 cpu 缓存、内核/文件系统内存缓存、磁盘驱动器内存缓存等。您要问的是刷新所有缓存需要多长时间?

或者,另一种看待它的方式是,如果磁盘驱动器坏了会发生什么?所有刷新都不能保证成功的读取或写入操作。

磁盘驱动器最终会变坏。您正在寻找的解决方案是如何拥有一个冗余的 cpu/磁盘驱动器系统,以便该系统在组件故障后仍能继续工作。

您可以提高系统在 RAID 阵列和其他高可用性配置等硬件的帮助下继续工作的可能性。

就软件解决方案而言,我认为答案是,相信操作系统会做最优化的事情。他们中的大多数定期刷新缓冲区。

关于file - 文件系统写入缓冲区通常在几秒后被刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650134/

相关文章:

java - renameTo() 方法删除了我的文件,但是文件去了哪里?

ruby-on-rails - Ruby 中 StringIO 的未定义方法 'path'

java - 分离解析法

java - 文件操作在 Java Web Start 中不起作用

javascript - JS 十六进制字符串到文件的实际字节值

c# - 如何在 C# 中使用 Windows 搜索服务

android - Android 中的长时间运行任务

c# - 使用 protobuf-net 为 c# 生成的文件与在 C++ 中生成的相同文件略有不同

file - 删除两个 : hidden and normal files with cmd

c - 自由空间位图C实现