使用xargs的并行处理-优化shell脚本

时间:2019-07-12 04:11:02

标签: shell parallel-processing xargs gnu-parallel

使用xargs进行并行处理-在某些服务器上花费太多时间(〜8小时)

我有一个脚本,可以扫描整个文件系统,并对选择性文件堆进行一些处理。我正在使用xargs并行执行此操作。使用xargs而不是使用GNU parallel是因为我必须在100台服务器上运行此脚本,并且不能在所有服务器上安装实用程序。

所有服务器都具有以下配置

体系结构:x86_64 处理器:24 每个核心线程数:2 每个插槽的核心数:6 插座:2

我尝试增加进程数量,但超出了无济于事的地步。我在某处读到,如果脚本是受I / O约束的,则最好使进程数等于内核数。真的吗?

find . -type f ! -empty -print0 | xargs -L1 -P 10 -0 "./process.sh"

我相信上面的代码将使我的脚本具有I / O约束?

我必须扫描整个文件系统。如何优化代码,从而可以大大减少处理时间。

此外,我的代码仅需要处理文件系统中文件的并行处理。可以并行处理服务器。

1 个答案:

答案 0 :(得分:1)

您需要找到瓶颈所在。

从您的问题尚不清楚您是否已找到瓶颈所在。

如果是CPU,那么您可以将我们的100台服务器与GNU Parallel一起使用,而无需在所有服务器上都安装GNU Parallel(顺便问一下parallel --embed自20180322以来是否可用?)

您只需在sshlogins前面加上CPU线程数和/即可。因此,对于24个线程:

find ... | 
  parallel -S 24/server1,24/server2,24/server3 command

如果瓶颈是磁盘,那么使用更多服务器将无济于事。

然后最好获得更快的磁盘(例如SSD,镜像磁盘,RAM磁盘等)。

实际上无法预测磁盘上使用的最佳线程数。它只能被测量。我有一个40轴RAID系统,最佳数量是10个线程。