文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

现在的服务器一般都是多核、甚至是多处理器的,因此有足够的计算能力来处理任务。但是,如果你的任务不并行执行的话,将无法利用服务器强大的资源。

下面是一些可以通过并行计算来提升任务速度的场景:

  1. 从多个源目录中备份文件到移动磁盘
  2. 批量对目录中的图片进行缩放
  3. 文件压缩

为了并行的执行一个任务,我们可以使用如下命令:

  • ppss
  • pexec
  • GNU parallel

本文主要讲述 GNU parallel 命令的使用。

第 1 段(可获 1.19 积分)

安装 GNU Parallel

请使用以下命令在 Debian/Ubuntu 系统中安装 GNU parallel :

$ sudo apt-get install parallel

使用方法

GNU parallel 程序提供了很多参数用来定制工具的行为。有兴趣的读者可以参考 man page 来学习这些参数的使用。在这篇文字中我们主要在以下场景中使用 GNU parallel 。

我的目标是在一台多核机器上并行运行一个 shell 命令。该命令包含多个参数,但只有一个是不同的。具体的说就是为同一个命令提供不同的参数来执行多个实例。通过标准输入每一行放一个参数传递给 GNU parallel

第 2 段(可获 1.41 积分)

接下来我们将讲述如何通过 GNU parallel 来备份多个源目录,我们将并行的执行 rsync 命令。

并行备份

下面的命令并行的备份两个目录:/home/peter/data.

$ echo -e '/home/peter\n/data' | parallel -j-2 -k --eta rsync -R -av {} /media/myBKUP

标准输入

echo 命令使用换行符来组合两个源目录,并通过管道传递给 GNU parallel.

执行多少任务?

默认情况下 GNU parallel 为每个任务分配一个处理器核,你可以使用 -j 参数来修改这个默认配置。

-j 用来设置通过 GNU parallel 发布并行任务的最大数量。可以有多种方式来指定最大值为 1:

第 3 段(可获 1.08 积分)
  • -j 加一个数值,例如 -j2 表示并行运行 2 个任务.
  • -j+ 加一个数值,例如 -j+2 表示最大的任务是为处理器核数+2 2.
  • -j- 加一个数值,例如 -j-2 表示最大的任务是处理器核数 - 2.

如果你不知道机器上有多少处理器核,可以使用如下命令来查看:

$ parallel --number-of-cores
8

保持输出有序

每个任务都会输出数据到控制台,由于多个任务是并行执行的,任务在执行完毕就会输出结果。这样我们在查看运行结果时就会被搞糊涂了,而 -k 参数可以让输出的顺序与输入的顺序一致。

第 4 段(可获 1.61 积分)

显示进度

--eta 参数可以显示 GNU parallel 任务执行的进度,包括以秒显示的预估剩余时间。

输入占位符

GNU parallel 替换 {} 参数为标准输入中的下一行数据。

每一个输入的行包含一个目录,例如 /home/peter。不需要完整的路径,我们也可以指定其他参数用于提取部分的内容,例如目录名 (/home) 和文件名 (peter). 详情请参考 man page

总结

GNU parallel 是一个 Linux 的管理工具。并行的运行一个任务可以提升其效率。如果你熟悉 xargs 命令的话,你会发现二者的语法很相似。如果你对这个命令比较陌生,可以查看在线帮助 GNU parallel website.

第 5 段(可获 1.58 积分)

文章评论