【问题标题】:Run du on parallel并行运行 du
【发布时间】:2014-08-27 15:27:33
【问题描述】:

我有一个非常大的存储磁盘(16T)。我想在它上面运行“du”来计算每个子目录需要多少。然而,这需要很长时间。幸运的是,我有一组计算机可供使用。因此,我可以并行运行“du”,每个作业都在单独的子目录中运行,然后编写一个简单的脚本来执行此操作。是不是已经有这种东西了还是必须自己写?

【问题讨论】:

  • 请注意,IO 不能总是多任务处理。

标签: bash parallel-processing csh du


【解决方案1】:

从您的问题中不清楚您的存储是如何设计的(RAID 阵列、NAS、NFS 或其他)。

但是,几乎不管实际技术如何,并行运行 du 毕竟可能不是一个好主意 - 它实际上很可能会减慢速度。

磁盘阵列的 IOPS 容量有限,多个du 线程都将从该池中获取。 更糟糕的是,通常单个du 会多次减慢任何其他 IO 操作,即使 du 进程不会消耗大量磁盘吞吐量。

相比之下,如果您只有一个 CPU,运行并行 make (make -j N) 会减慢构建过程,因为进程切换会产生相当大的开销。

同样的原理也适用于磁盘,尤其是旋转磁盘。您将获得显着速度提升的唯一情况是当您将 N 个驱动器安装在独立目录中时(例如/mnt/disk1/mnt/disk2、...、/mnt/diskN)。在这种情况下,您应该在 N 个线程中运行 du,每个磁盘 1 个。

提高 du 速度的一个常见改进是使用noatime 标志安装磁盘。 如果没有此标志,大规模磁盘扫描会创建大量写入活动来更新访问时间。如果您使用noatime 标志,则可以避免写入活动,并且 du 工作得更快。

【讨论】:

  • 这是我大学的存储,所以我不熟悉细节。但是,由于这是一个大磁盘,其目的是用作集群的磁盘(在本例中为 condor),我假设它旨在同时支持多个(如果不是很多)IO 操作。
  • 您的客户端计算机如何使用此存储空间? NFS 挂载?如果是,那么并行扫描可能会起作用,因为 NFS 具有相当大的网络往返开销
  • 有没有办法让我自己检查这个(一些命令喜欢运行)?
  • 假设您的客户端计算机是 Linux 或任何其他类 Unix 系统,简单的检查是使用 mountdf 来检查具有 16TB 驱动器的目录的安装位置和方式。
  • 是的:...输入 nfs (rw,nosuid,relatime,vers=3,rsize=16384,wsize=16384,namlen=255,soft,proto=tcp,port=2049,timeo= 25,retrans=3,sec=sys,local_lock=none,addr=xxxx)
【解决方案2】:

使用 GNU Parallel 很简单:

parallel du ::: */*

【讨论】:

  • 如果有人想知道::: 咒语的神奇之处,请在文档中搜索“::: arguments”:gnu.org/software/parallel/man.html:“使用命令行中的参数而不是标准输入作为输入源(标准输入)。与 GNU 的其他选项不同,并行 ::: 位于命令之后和参数之前。”
  • 如果您想了解更多信息,请花 15 分钟阅读第 1+2 章:doi.org/10.5281/zenodo.1146014
  • 哦,太好了!感谢您分享这本书! :)
【解决方案3】:

已经有这种东西了还是必须自己写?

我为自己写了sn,但您可能也会喜欢它。

sn p .

将为您提供当前目录中所有内容的大小。它并行运行,在大型目录上比du 更快。

【讨论】:

  • 您是否考虑过申请 Homebrew 并将您的工具添加为安装配方?
  • 此外,执行sn o -n30 会将 123GB 目录置于 251MB 目录之下。 :( 似乎排序不尊重人性化格式。
猜你喜欢
  • 1970-01-01
  • 2022-10-02
  • 2014-06-15
  • 2017-11-28
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2012-12-04
  • 2018-07-14
相关资源
最近更新 更多