12

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

4

3 回答 3

10

使用 GNU Parallel 很简单:

parallel du ::: */*
于 2014-07-26T17:45:58.363 回答
3

已经有这样的东西还是我必须自己写?

sn为自己写的,但你也可能会欣赏它。

sn p .

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

于 2017-11-16T16:27:51.883 回答
2

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

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

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

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

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

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

于 2014-07-07T08:18:42.540 回答