技术解析

请问在 Linux 下如何清空一个大文件的内容对磁盘 I/O 的冲击较小?
0
2021-06-15 10:13:44
idczone

目前知道如下几种方式可以清空文件(假定文件名是 foo): 1 、echo>foo(>foo,:>foo) 2 、cp /dev/null(cat /dev/null)>foo 3 、dd if=/dev/null of=a 4 、truncate -s 0 a

请问哪种清理方式对磁盘的 I/O 冲击小一些?


个人认为是 1 和 4

为什么呢

重新链接一个文件,几乎没有磁盘 IO

rm -f a && touch a

硬连接?
这样会不会有一瞬间向这个文件写数据的应用报错?

因为没有向文件写数据。

显然和文件系统有关系,需要根据具体情况分析

也就是说不同的 fs 要用不同的命令保证冲击最小化?

清空文件本质上就是把文件的大小改为零。你说对这些方式调用的是同一个操作。
dd 文件默认就是先 truncate,重定向也是。
所以你就是贴了 4 个一样的东西……

相同的系统调用?

冲击小的正确方式应该让文件系统,根据磁盘设备的负载,来对 io 操作进行优先级划分。但是目前主流 fs 好像没这方面的 api 。
退而且求其次的方法是,监控磁盘设备的负载,负载高的时候不写入,负载低的时候再写入。

应该都是 flags 设置 O_TRUNC 标志的 open 系统调用,多看看操作系统底层,别被眼前的表象给骗了
数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服