在Linux下有效的文件更新

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

1.简单地更新相应的文件
2.删除旧文件并保存新文件

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

您正在使用的磁盘子系统和文件系统将在这里产生巨大的影响。 事实上有很多不同的可能的结果,你可能应该基准。 但是:

  • 请记住,实际的同步IO限制为SATA驱动器约为100 IOPS,SAS驱动器约为200 IOPS,SSD SSD IO IOPS约为10000。 将IOPS的数量乘以数据驱动器的数量。
  • 现代文件系统将把写入操作集中在一起。 正确的文件系统select和详细的调整会将结果改变10到100倍。
  • 现代存储控制器可以caching写入。 正确的写回caching设置将再次将结果更改为10到1000倍。

所以适当的硬件(真正的RAID控制器与WBcaching,固态硬盘),适当的软件(现代文件系统,ext3是绝对不可能的问题,我会用xfs,但ext4是一个选项)和适当的调整(testing各种内核IO调度,IO尺寸等设置)会产生巨大的影响。

如果你正在更新它,那么文件内容陈旧不可能是你的问题。 如果是这样,请将其粘贴在tmpfs上,在更新时截断文件并重新写入。 这将是最便宜的方法,因为根本不可能使用磁盘。

第二个最接近的方法是截断/写入一个文件系统,该文件系统的noatime安装选项已设置,日志closures。 但是,如果你崩溃了,那么它又冒险,因为你可能会丢失数据。

之后,它再次无法接通。

请记住,linux缓冲区以确定的时间间隔写入和同步到磁盘,所以你通常不会从I / O的angular度“感受”写入的影响(除非它的写入非常繁重,但可以调整)。 您可以更改条件以同步到磁盘,以便在同步到磁盘之前可以长时间填写写入缓冲区。

如果你做了一些非常聪明的事情,使用fallocate预先分配文件的空间,这将是其最大的可能值。 然后,mmap打开文件直接读取到内存。 然后重写将近瞬时(但是如果你有电力损失是有损的)。 然后您可以通过msync调用来控制何时刷新到磁盘。

假设一个FLAT文件,而不是一个数据库文件,优点和缺点两种方法真的:

  1. 如果您只是简单地覆盖文件的内容,那么您肯定会阻止重新分配步骤。 所以你可以在那里省点时间。 但是,这些部分的放置可能不是最佳的。

  2. 根据磁盘的碎片情况,您可能会获得更优化的数据位置。 但是,如果空间必须分配,那么速度会稍慢一些,如果您运行的是更安全的设置,那么在分配之前将会有足够的时间来清空块。