我的程序创建了许多短暂的小文件。它们通常会在创建后一秒钟内被删除。这些文件位于由真实硬盘支持的 ext4 文件系统中。我知道 Linux 会定期将 ( pdflush
) 脏页刷新到磁盘。由于我的文件是短暂的,很可能它们没有被pdflush
.我的问题是,我的程序是否会导致大量磁盘写入?我关心的是硬盘的寿命。
由于文件很小,我们假设它们的大小总和小于dirty_bytes
和dirty_background_bytes
。
Ext4打开了默认日志,即元数据日志。我还想知道元数据或数据是否写入磁盘。
答案1
除非您谈论的是固态驱动器,否则大量磁盘写入不会成为驱动器寿命的主要因素。
如果您确实想完全避免磁盘写入,请查看临时文件系统,
答案2
使用 ext4 的简单实验:
创建一个 100MB 的图像...
# dd if=/dev/zero of=image bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0533049 s, 2.0 GB/s
使其成为循环设备...
# losetup -f --show image
/dev/loop0
制作文件系统并挂载...
# mkfs.ext4 /dev/loop0
# mount /dev/loop0 /mnt/tmp
使用短期文件进行某种运行。 (将其更改为您喜欢的任何方法。)
for ((x=0; x<1000; x++))
do
(echo short-lived-content-$x > /mnt/tmp/short-lived-file-$x
sleep 1
rm /mnt/tmp/short-lived-file-$x ) &
done
卸载、同步、取消循环。
# umount /mnt/tmp
# sync
# losetup -d /dev/loop0
检查图像内容。
# strings image | grep short-lived-file | tail -n 3
short-lived-file-266
short-lived-file-895
short-lived-file-909
# strings image | grep short-lived-content | tail -n 3
就我而言,它列出了所有文件名,但没有列出文件内容。所以只写了内容。
答案3
一般来说,不,它们不会被写下来。这是因为当满足以下两个条件之一时,缓存会刷新脏页:
数据在 后过期
/proc/sys/vm/dirty_writeback_centisecs
,默认为 5 秒。缓存的内存太少,无法容纳数据,超过了
dirty_ratio
缓存中的脏页(默认为 20%)。
因此,在具有大量可用内存且写入流量很少(除了在 5 秒内删除的小文件之外)的系统上,数据不会被刷新。
答案4
短期文件是否写入磁盘不仅取决于内核文件缓存的默认行为,还取决于文件系统驱动程序实现的细节和所述文件系统的挂载选项。可以将系统配置为将所有内容立即写入磁盘(本质上是类似 DOS 的行为)。
XFS 是一种突出显示您感兴趣的行为(所谓的“延迟分配”)的文件系统。有了它,您或多或少可以确定(在其他地方没有有趣的配置选项)属于刚刚删除的文件的块将在内存中重用,而无需中间磁盘访问。 XFS 可能仍然想要更新其元数据日志(它将相当频繁地写入磁盘;然而,鉴于 XFS 的日志只是元数据,它足够小,可以在其他一些快速设备上设置,例如发现的电池支持 RAM在许多 RAID 控制器上)。
由于这种行为,突然断电后,在 XFS 文件系统上发现完全清零但看起来合法的文件(大小和其他元数据完好无损)的情况并不少见。这是支持快速“半临时”文件操作的成本。
一些理论
一般来说,访问文件系统的系统调用很快就会在文件系统驱动程序定义的方法中结束(在注册 VFS 驱动程序时附加到“struct inode_operations”和“struct file_operations”)。之后发生的事情完全由文件系统实现自行决定。通常,使用类似于以下方法的方法(这个简单的示例来自 Linux FAT 驱动程序):
if (IS_DIRSYNC(dir))
(void)fat_sync_inode(dir);
else
mark_inode_dirty(dir);
如果文件系统以“同步”模式挂载,则所有更改都会立即写入磁盘(在本例中通过 fat_sync_inode() )。否则,该块将被标记为“脏”并保留在内存高速缓存中,直到在某个合理的机会刷新为止。
因此,如果不考虑文件系统挂载选项并检查其实现的源代码,就不可能预测关于瞬态文件的系统行为(当然,这主要适用于大多数在嵌入式空间中发现的各种外来文件系统) 。