请问在 Linux 下如何清空一个大文件的内容对磁盘 I/O 的冲击较小?

2020-11-22 16:26:54 +08:00
 zhoudaiyu

目前知道如下几种方式可以清空文件(假定文件名是 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 冲击小一些?

5937 次点击
所在节点    Linux
42 条回复
ysc3839
2020-11-22 16:31:51 +08:00
个人认为是 1 和 4
zhoudaiyu
2020-11-22 16:33:35 +08:00
@ysc3839 #1 为什么呢
xuanbg
2020-11-22 16:47:38 +08:00
重新链接一个文件,几乎没有磁盘 IO
XiLingHost
2020-11-22 18:08:08 +08:00
rm -f a && touch a
zhoudaiyu
2020-11-22 18:18:05 +08:00
@xuanbg #3 硬连接?

@XiLingHost #4 这样会不会有一瞬间向这个文件写数据的应用报错?
ysc3839
2020-11-22 18:36:13 +08:00
@zhoudaiyu 因为没有向文件写数据。
codehz
2020-11-22 18:37:52 +08:00
显然和文件系统有关系,需要根据具体情况分析
zhoudaiyu
2020-11-22 18:58:52 +08:00
@codehz #7 也就是说不同的 fs 要用不同的命令保证冲击最小化?
msg7086
2020-11-22 19:07:24 +08:00
清空文件本质上就是把文件的大小改为零。你说对这些方式调用的是同一个操作。
dd 文件默认就是先 truncate,重定向也是。
所以你就是贴了 4 个一样的东西……
zhoudaiyu
2020-11-22 19:12:32 +08:00
@msg7086 #9 相同的系统调用?
laminux29
2020-11-22 19:18:33 +08:00
冲击小的正确方式应该让文件系统,根据磁盘设备的负载,来对 io 操作进行优先级划分。但是目前主流 fs 好像没这方面的 api 。

退而且求其次的方法是,监控磁盘设备的负载,负载高的时候不写入,负载低的时候再写入。
fasionchan
2020-11-22 19:26:14 +08:00
@zhoudaiyu 应该都是 flags 设置 O_TRUNC 标志的 open 系统调用,多看看操作系统底层,别被眼前的表象给骗了😁

也许可以尝试分多次 truncate,每次只截短一点,最终截到 0
zhoudaiyu
2020-11-22 19:40:45 +08:00
@laminux29 #11 至少我们用的 ext3 好像没有
@fasionchan #12 分次 truncate 靠谱
muzuiget
2020-11-22 20:41:37 +08:00
这不是文件系统的的责任吗,本来删除文件就是仅删除文件元数据,下次写数据覆盖就是了,删除就是马上完成的事。

你要是“安全擦除”那种,你这么还是得每隔字节覆盖一次,哪种方法都一样。
walker2laok
2020-11-22 22:55:53 +08:00
echo ' ' > big_file.log
mingl0280
2020-11-23 02:29:59 +08:00
我印象里这四个最后都是调的 trunc,所以没区别(?),你可以自己创建几个文件 strace 下……
iceheart
2020-11-23 07:22:36 +08:00
unlink
ericbize
2020-11-23 08:52:15 +08:00
很好奇楼主使用场景
AmrtaShiva
2020-11-23 09:00:55 +08:00
15L 这个自己用过
vuuv
2020-11-23 09:03:25 +08:00
4 最小,1 次之。因为 1 相当于 truncate+write 空字符串,多了至少一次磁盘操作。当然内核也可能把这几次操作给合并掉,从而没有差异。
2 和 3 是一样的坑,因为没有限定源或目的的大小,会占满整个分区。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/728067

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX