Linux下有效的文件更新

Linux下有效的文件更新

在 Linux 下的高性能设置(许多并发更新)下,这是更新磁盘上 30k 文件最有效的方法:


1. 只需更新相应文件
2. 删除旧文件并保存新文件


我主要关心的是磁盘访问时间,但处理器负载也可能是一个因素。

答案1

您使用的磁盘子系统和文件系统将对此产生巨大影响。事实上,可能出现的结果有很多种,您可能应该对其进行基准测试。但是:

  • 请记住,对于 SATA 驱动器,实际同步 IO 限制为 100 IOPS 左右,对于 SAS 驱动器,限制为 200 IOPS,对于 SSD,则从 10 IOPS 到 10000 IOPS 变化很大。将 IOPS 数量乘以数据驱动器数量。
  • 现代文件系统会将写入操作集中在一起。选择合适的文件系统并进行细致的调优,将使结果发生 10 到 100 倍的改变。
  • 现代存储控制器可以缓存写入。正确的写回缓存设置将再次将结果改变 10 到 1000 倍。

因此,合适的硬件(带有 WB 缓存的真实 RAID 控制器、SSD)、合适的软件(现代文件系统,ext3 在这里绝对是不可能的,我会选择 xfs,但 ext4 也是一个选项)和合适的调整(测试各种内核 IO 调度程序、IO 大小等设置)将产生巨大的影响。

答案2

如果您要大量更新它,那么文件内容过时对您来说可能不是问题。如果是这样,请将其粘贴在 tmpfs 上,在更新时截断文件并重写到其中。这将是最便宜的方法,因为它根本不可能使用磁盘。

下一个最接近的方法是截断/写入具有诺亚泰设置挂载选项并关闭日志记录。但是如果您崩溃,那么风险又很大,因为您可能会丢失数据。

此后,日志功能再次开启。

请记住,Linux 会按确定的时间间隔缓冲写入并同步到磁盘,因此您通常不会从 I/O 的角度“感受到”写入的影响(除非写入量非常大,但这是可调的)。您也可以更改同步到磁盘的条件,这样您就可以让写入缓冲区在同步到磁盘之前长时间填满。

如果您做了一些非常聪明的事情……请使用 fallocate 为文件预分配空间,这将是其最大可能值。然后,mmap 打开文件以将其直接读取到内存中。然后重写将几乎是即时的(但如果断电,则会有损耗)。然后,您可以使用 msync 调用控制何时刷新回磁盘。

答案3

假设是一个平面文件,而不是数据库文件,两种方法的优缺点实际上如下:

  1. 如果您只是就地覆盖文件内容,那么您肯定可以避免重新分配步骤。因此您可能会节省一点时间。但是,碎片的放置可能不是最佳的。

  2. 根据磁盘碎片情况,您可能会得到更优化的数据放置位置。但是速度会稍微慢一些,因为必须分配空间,如果您在更安全的环境中运行,则在分配之前需要时间将块清零。

相关内容