跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请问在 Linux 下如何清空一个大文件的内容对磁盘 I/O 的冲击较小?
未分類
2020 年 11 月 25 日

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

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

資深大佬 : zhoudaiyu 2

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

大佬有話說 (40)

  • 資深大佬 : ysc3839

    个人认为是 1 和 4

  • 主 資深大佬 : zhoudaiyu

    @ysc3839 #1 为什么呢

  • 資深大佬 : xuanbg

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

  • 資深大佬 : XiLingHost

    rm -f a && touch a

  • 主 資深大佬 : zhoudaiyu

    @xuanbg #3 硬连接?

    @XiLingHost #4 这样会不会有一瞬间向这个文件写数据的应用报错?

  • 資深大佬 : ysc3839

    @zhoudaiyu 因为没有向文件写数据。

  • 資深大佬 : codehz

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

  • 主 資深大佬 : zhoudaiyu

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

  • 資深大佬 : msg7086

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

  • 主 資深大佬 : zhoudaiyu

    @msg7086 #9 相同的系统调用?

  • 資深大佬 : laminux29

    冲击小的正确方式应该让文件系统,根据磁盘设备的负载,来对 io 操作进行优先级划分。但是目前主流 fs 好像没这方面的 api 。

    退而且求其次的方法是,监控磁盘设备的负载,负载高的时候不写入,负载低的时候再写入。

  • 資深大佬 : fasionchan

    @zhoudaiyu 应该都是 flags 设置 O_TRUNC 标志的 open 系统调用,多看看操作系统底层,别被眼前的表象给骗了

  • 主 資深大佬 : zhoudaiyu

    @laminux29 #11 至少我们用的 ext3 好像没有
    @fasionchan #12 分次 truncate 靠谱

  • 資深大佬 : muzuiget

    这不是文件系统的的责任吗,本来删除文件就是仅删除文件元数据,下次写数据覆盖就是了,删除就是马上完成的事。

    你要是“安全擦除”那种,你这么还是得每隔字节覆盖一次,哪种方法都一样。

  • 資深大佬 : walker2laok

    echo ‘ ‘ > big_file.log

  • 資深大佬 : mingl0280

    我印象里这四个最后都是调的 trunc,所以没区别(?),你可以自己创建几个文件 strace 下……

  • 資深大佬 : iceheart

    unlink

  • 資深大佬 : ericbize

    很好奇主使用场景

  • 資深大佬 : AmrtaShiva

    15L 这个自己用过

  • 資深大佬 : vuuv

    4 最小,1 次之。因为 1 相当于 truncate+write 空字符串,多了至少一次磁盘操作。当然内核也可能把这几次操作给合并掉,从而没有差异。
    2 和 3 是一样的坑,因为没有限定源或目的的大小,会占满整个分区。

  • 資深大佬 : vuuv

    另外,文件不是你单方面清空就了事了,你得有机制告诉进程重新调整已打开文件的 offset 。
    不然进程会继续使用其保存的 offset 写文件。如果之前是 2G,那么外部清空后,此进程的文件依旧保持打开状态,会继续从 2G 开始写,这种被称为稀疏文件。假设写 100m,则 ls 大小 2.1G (看 offset ),du 大小 100m (数 fs block )。
    更加常规的做法是 mv 原文件,然后生成新的空文件,然后(大都用 sighup )通知进程重新打开一次。从而完成文件切换。这样重新打开文件前,数据会继续写到原文件,之后只写新文件,算是无缝切换了。

  • 資深大佬 : openbsd

    一般都是用 15 说的法子

  • 資深大佬 : liuhuan475

    echo ” > xxx

  • 資深大佬 : sujin190

    @zhoudaiyu #5 删除后需要等所有一打开的进程都关闭这个文件之后才会真正从磁盘删除,继续读写完全是正常的,磁盘其实并不会释放,所以如果你想说的类似日志文件写的太大了,想清空它又不想重启进程估计不行,似乎不让进程重新打开这个文件是不行的吧,否则删除新建最靠谱了

  • 主 資深大佬 : zhoudaiyu

    @ericbize 清理大日志

  • 資深大佬 : ericbize

    @zhoudaiyu 写个脚本,没什么 io 的时候操作不稳么

  • 資深大佬 : li492135501

    在文件表里删掉

  • 主 資深大佬 : zhoudaiyu

    @ericbize 那还得定时查 IO 啊

  • 資深大佬 : ericbize

    只要不是像我司这种, 7×24 都是高峰的, 晚上一般都还好吧!

  • 主 資深大佬 : zhoudaiyu

    @ericbize 但是往往白天磁盘就告警了…

  • 資深大佬 : no1xsyzy

    @vuuv
    1 具体是否会 write 甚至是 shell 的具体实现。有可能 shell 的 > 重定向在长度 = 0 的时候不写入。
    不过 shell 似乎是 fork 之后 open,把拿到的 fp 替换 stdout 然后 exec ?那样的话似乎得看 echo 的实现。
    2 和 3: /dev/null 作为读取的时候大小就是 0 (区别于 /dev/zero ),一读就是 EOF

  • 資深大佬 : no1xsyzy

    你这是写了多少日志?白天就占满磁盘,这么多内容有人看吗?看得过来吗?
    没人看直接写进 /dev/null

  • 資深大佬 : Jirajine

    @zhoudaiyu XY 问题,日志不该直接写到磁盘上。就算要写也是统一收集分析后再写,这样清理的时候一定要让进程 reload 一下重新打开文件。

  • 資深大佬 : CallMeReznov

    姿势和设备使用方法不对的结果。
    2X 个盘 R5 软阵列了解一下?
    请问在 Linux 下如何清空一个大文件的内容对磁盘 I/O 的冲击较小?

  • 資深大佬 : ppphp

    日志应该 logrotate,不应该出现大日志其实

  • 主 資深大佬 : zhoudaiyu

    @no1xsyzy 其实没人看 但是好多日志都是这么玩的 没时间弄 (狗头

    @Jirajine
    @ppphp 说的对,但是工作量太大了,太不规范了

  • 主 資深大佬 : zhoudaiyu

    @CallMeReznov 不太清楚公司的虚机磁盘做没做 raid

  • 資深大佬 : DoctorCat

    冲击较小怎么理解???
    除非是写大量的数据进去,相比删除,几个原理都差不多的。最终都是要 read 、mmap 、fstat 、write 操作的。
    VFS 只是几组数据结构呀,提供统一接口并维持状态而已,同一个文件系统中,排除中断的耗时和磁盘性能因素外,基本都一样。

  • 資深大佬 : no1xsyzy

    啊,其实还有这种方法来清空文件:shell 里直接输入
    > filename
    我想起来了, > 的时候会自动因为 open 的模式是 w 而 truncate 掉。
    仍然有稀疏文件的问题。

    想到,还有就是 mkfifo a.log 然后 nohup cat < a.log > /dev/null

  • 資深大佬 : doubledna

    echo ” ” > filename

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具