目前知道如下几种方式可以清空文件(假定文件名是 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 系统调用,多看看操作系统底层,别被眼前的表象给骗了