请问在 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 冲击小一些?

5711 次点击
所在节点    Linux
42 条回复
vuuv
2020-11-23 09:12:07 +08:00
另外,文件不是你单方面清空就了事了,你得有机制告诉进程重新调整已打开文件的 offset 。
不然进程会继续使用其保存的 offset 写文件。如果之前是 2G,那么外部清空后,此进程的文件依旧保持打开状态,会继续从 2G 开始写,这种被称为稀疏文件。假设写 100m,则 ls 大小 2.1G (看 offset ),du 大小 100m (数 fs block )。
更加常规的做法是 mv 原文件,然后生成新的空文件,然后(大都用 sighup )通知进程重新打开一次。从而完成文件切换。这样重新打开文件前,数据会继续写到原文件,之后只写新文件,算是无缝切换了。
openbsd
2020-11-23 09:20:07 +08:00
一般都是用 15 楼说的法子
liuhuan475
2020-11-23 09:32:35 +08:00
echo '' > xxx
sujin190
2020-11-23 09:39:10 +08:00
@zhoudaiyu #5 删除后需要等所有一打开的进程都关闭这个文件之后才会真正从磁盘删除,继续读写完全是正常的,磁盘其实并不会释放,所以如果你想说的类似日志文件写的太大了,想清空它又不想重启进程估计不行,似乎不让进程重新打开这个文件是不行的吧,否则删除新建最靠谱了
zhoudaiyu
2020-11-23 09:45:28 +08:00
@ericbize 清理大日志
ericbize
2020-11-23 11:26:15 +08:00
@zhoudaiyu 写个脚本,没什么 io 的时候操作不稳么
li492135501
2020-11-23 11:27:37 +08:00
在文件表里删掉
zhoudaiyu
2020-11-23 11:29:25 +08:00
@ericbize 那还得定时查 IO 啊
ericbize
2020-11-23 11:41:07 +08:00
只要不是像我司这种, 7x24 都是高峰的, 晚上一般都还好吧!
zhoudaiyu
2020-11-23 12:00:28 +08:00
@ericbize 但是往往白天磁盘就告警了...
no1xsyzy
2020-11-23 12:21:39 +08:00
@vuuv
1 具体是否会 write 甚至是 shell 的具体实现。有可能 shell 的 > 重定向在长度 = 0 的时候不写入。
不过 shell 似乎是 fork 之后 open,把拿到的 fp 替换 stdout 然后 exec ?那样的话似乎得看 echo 的实现。
2 和 3: /dev/null 作为读取的时候大小就是 0 (区别于 /dev/zero ),一读就是 EOF
no1xsyzy
2020-11-23 12:25:21 +08:00
你这是写了多少日志?白天就占满磁盘,这么多内容有人看吗?看得过来吗?
没人看直接写进 /dev/null
Jirajine
2020-11-23 12:28:11 +08:00
@zhoudaiyu XY 问题,日志不该直接写到磁盘上。就算要写也是统一收集分析后再写,这样清理的时候一定要让进程 reload 一下重新打开文件。
CallMeReznov
2020-11-23 13:23:35 +08:00
姿势和设备使用方法不对的结果。
2X 个盘 R5 软阵列了解一下?
ppphp
2020-11-23 13:41:05 +08:00
日志应该 logrotate,不应该出现大日志其实
zhoudaiyu
2020-11-23 13:59:16 +08:00
@no1xsyzy 其实没人看 但是好多日志都是这么玩的 没时间弄 (狗头

@Jirajine
@ppphp 说的对,但是工作量太大了,太不规范了
zhoudaiyu
2020-11-23 13:59:59 +08:00
@CallMeReznov 不太清楚公司的虚机磁盘做没做 raid
DoctorCat
2020-11-23 16:31:09 +08:00
冲击较小怎么理解???
除非是写大量的数据进去,相比删除,几个原理都差不多的。最终都是要 read 、mmap 、fstat 、write 操作的。
VFS 只是几组数据结构呀,提供统一接口并维持状态而已,同一个文件系统中,排除中断的耗时和磁盘性能因素外,基本都一样。
no1xsyzy
2020-11-23 22:53:19 +08:00
啊,其实还有这种方法来清空文件:shell 里直接输入
> filename
我想起来了, > 的时候会自动因为 open 的模式是 w 而 truncate 掉。
仍然有稀疏文件的问题。

想到,还有就是 mkfifo a.log 然后 nohup cat < a.log > /dev/null
doubledna
2020-11-24 08:15:50 +08:00
echo " " > filename

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

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

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

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

© 2021 V2EX