AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 128012
Accepted
user13185
user13185
Asked: 2010-04-01 01:24:19 +0800 CST2010-04-01 01:24:19 +0800 CST 2010-04-01 01:24:19 +0800 CST

如何让 `rm` 在 ext3/linux 上更快?

  • 772

我使用默认选项安装了 ext3 文件系统。在它上面我有一些 ~ 100GB 的文件。

删除任何此类文件需要很长时间(8 分钟)并导致大量 io 流量,从而增加服务器的负载。

有没有办法让 rm 不那么具有破坏性?

performance linux ext3 rm unlink
  • 11 11 个回答
  • 28741 Views

11 个回答

  • Voted
  1. janneb
    2010-04-01T02:57:46+08:002010-04-01T02:57:46+08:00

    升级到 ext4 或其他一些使用范围的现代文件系统。由于 ext3 使用间接块方案而不是扩展区,因此删除大文件不可避免地需要大量工作。

    • 18
  2. Best Answer
    Matt McClure
    2012-01-04T19:33:41+08:002012-01-04T19:33:41+08:00

    最有趣的答案最初埋在对该问题的评论中。这是使其更加明显的一流答案:

    基本上这里没有任何方法有效,所以我们开发了自己的方法。在这里对其进行了描述:http: //www.depesz.com/index.php/2010/04/04/how-to-remove-backups/ – depesz 2010 年 4 月 6 日 15:15

    该链接是对探索和发现可行解决方案的令人难以置信的彻底分析。

    另请注意:

    文章说:

    如您所见,我使用-c2 -n7了 ionice 选项,这看起来很正常。

    这是真的,但用户 TafT 说,如果您不希望受到干扰,那么-c3“空闲”将是比-c2“尽力而为”更好的选择。他过去常常-c3在后台构建,并且发现它运行良好,不会导致构建永远等待。如果您确实有 100% 的 io 使用率,那么-c3将不会让删除完成,但他不希望这是您基于工作测试所拥有的。

    • 14
  3. Dennis Williamson
    2010-04-01T01:46:07+08:002010-04-01T01:46:07+08:00

    你可以试试ionice 。它不会让它更快,但它可能会减少它的破坏性。

    • 6
  4. user126330
    2010-04-01T01:36:25+08:002010-04-01T01:36:25+08:00

    就效率而言,每个文件使用一个 rm 并不是最优的,因为它需要为每个 rm 一个 fork 和 exec。

    假设您有一个 list.txt 包含要删除的文件,这会更有效率,但它仍然会很慢:

    xargs -i rm {} < list.txt
    

    另一种方法是:( nice -20 xargs -i rm {} < list.txt
    这将花费更少的时间,但会极大地影响您的系统:)

    或者

    我不知道这会有多快,但是:

    mv <file-name> /dev/null 
    

    或者

    使用快速文件系统创建一个特殊的挂载点(使用循环设备?),用它来存储和删除你的巨大文件。
    (也许在删除文件之前将文件移到那里,也许它更快,或者当你想要文件消失时卸载它)

    或者

    cat /dev/null > /file/to/be/deleted(所以它现在是零大小)如果你想让它rm -rf <file>现在消失

    甚至更好

    放下猫,然后做# > /file/to/be/emptied

    • 4
  5. Nick Woodhams
    2012-12-24T07:50:21+08:002012-12-24T07:50:21+08:00

    我在以合理的速度删除目录时遇到问题,结果发现该进程正在锁定磁盘并创建一堆试图访问磁盘的进程。ionice 没有工作,它只是继续使用 99% 的磁盘 IO 并锁定所有其他进程。

    这是对我有用的 Python 代码。它一次删除 500 个文件,然后休息 2 秒让其他进程完成工作,然后继续。效果很好。

    import os, os.path
    import time
    
    for root, dirs, files in os.walk('/dir/to/delete/files'):
        file_num = 0
        for f in files:
            fullpath = os.path.join(root, f)
            os.remove(fullpath)
            if file_num%500 == 1:
                time.sleep(2)
                print "Deleted %i files" % file_num
            file_num = file_num + 1
    
    • 1
  6. Emmanuel Devaux
    2015-01-31T01:51:53+08:002015-01-31T01:51:53+08:00

    我的两分钱。

    我已经有这个问题了。“在必须快速运行的顺序脚本中,该过程确实删除了很多文件” .. 所以“rm”将使该脚本速度接近 IO 等待/执行时间。

    所以为了让事情变得更快,我添加了另一个进程(bash 脚本),每个 cron 启动......就像垃圾收集器一样,它会删除特定目录中的所有文件。

    然后我通过将“rm”替换为“垃圾文件夹”来更新原始脚本(通过在其名称末尾添加一个计数器来重命名文件以避免冲突)。

    这对我有用,脚本运行速度至少快 3 倍。但只有当垃圾文件夹和原始文件在同一挂载点(同一设备)下才能正常工作以避免文件复制。(同一设备上的 mv 消耗的 IO 比 rm 少)

    希望有帮助..

    • 1
  7. famzah
    2010-04-01T07:10:57+08:002010-04-01T07:10:57+08:00

    另请注意,建议将ionice作为负载的解决方法的 Dennis Williamson 的回答仅在您的块设备使用 CFQ io 调度程序时才有效。

    • 0
  8. Felipe Alvarez
    2010-05-22T02:22:39+08:002010-05-22T02:22:39+08:00

    mv <文件名> /dev/null

    /dev/null 是文件而不是目录。无法将文件移动到文件中,否则可能会覆盖它。

    使用快速文件系统创建一个特殊的挂载点(使用循环设备?),用它来存储和删除你的巨大文件。(也许在删除文件之前将文件移到那里,也许它更快,或者当你想要文件消失时卸载它)

    我不认为这是实用的。它将不必要地使用比 OP 想要的更多的 I/O。

    • 0
  9. amphetamachine
    2011-02-22T17:40:11+08:002011-02-22T17:40:11+08:00

    您可以尝试创建一个循环文件​​系统来存储您的备份。

    # dd if=/dev/zero of=/path/to/virtualfs bs=100M count=1024 # 100 MB * 1024 = 100 GB
    # mke2fs /path/to/virtualfs
    # mount -t ext2 /path/to/virtualfs /mnt/backups -o loop
    

    然后,当您要清除备份时:

    # umount /mnt/backups
    # mke2fs /path/to/virtualfs
    # mount -t ext2 /path/to/virtualfs /mnt/backups -o loop
    

    快!整个虚拟文件系统很快就会被清除。

    • 0
  10. Juan Carlos
    2012-03-13T01:57:24+08:002012-03-13T01:57:24+08:00

    您可以使用 xargs 的多标题

    find . -type f | xargs -P 30 rm -rf 
    

    其中 30 是您要创建的线程数。如果您使用零,系统会为执行任务的用户创建最大可用线程。

    • 0

相关问题

  • 上线的第一天:如何不杀死您的网站

  • IIS 优化

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve