使用 parallel 利用起你的所有 CPU 资源
创始人
2024-03-01 21:21:15
0

bash 命令通常单线程运行。这意味着所有的处理工作只在单个 CPU 上执行。随着 CPU 规模的扩大以及核心数目的增加,这意味着只有一小部分的 CPU 资源用于处理你的工作。

当我们的工作受制于 CPU 处理数据的速度时,这些未使用的 CPU 资源能产生很大的效用。这种情况在进行多媒体转换(比如图片和视频转换)以及数据压缩中经常遇到。

本文中,我们将会使用 parallel 程序。parallel 会接受一个列表作为输入,然后在所有 CPU 核上并行地执行命令来处理该列表。Parallel 甚至会按顺序将结果输出到标准输出中,因此它可以用在管道中作为其他命令的标准输入。

如何使用 parallel

parallel 在标准输入中读取一个列表作为输入,然后创建多个指定命令的进程来处理这个列表,其格式为:

list | parallel command

这里的 list 可以由任何常见的 bash 命令创建,例如:catgrepfind。这些命令的结果通过管道从它们的标准输出传递到 parallel 的标准输入,像这样:

find . -type f -name "*.log" | parallel

find 中使用 -exec 类似,parallel 使用 {} 来表示输入列表中的每个元素。下面这个例子中,parallel 会使用 gzip 压缩所有 find 命令输出的文件:

find . -type f -name "*.log" | parallel gzip {}

下面这些实际的使用 parallel 的例子可能会更容易理解一些。

使用 parallel 来进行 JPEG 压缩

在这个例子中,我收集了一些比较大的 .jpg 文件(大约 10MB 大小),要用 Mozilla 出品的 JPEG 图像压缩工具 MozJPEG 来进行处理。该工具会在尝试保持图像质量的同时减少 JPEG 图像文件的大小。这对降低网页加载时间很重要。

下面是一个普通的 find 命令,用来找出当前目录中的所有 .jpg 文件,然后通过 MozJPEG 包中提供的图像压缩工具 (cjpeg) 对其进行处理:

find . -type f -name "*.jpg" -exec cjpeg -outfile LoRes/{} {} ';'

总共耗时 0m44.114s。该命令运行时的 top 看起来是这样的:

你可以看到,虽然有 8 个核可用,但实际只有单个线程在用单个核。

下面用 parallel 来运行相同的命令:

find . -type f -name "*.jpg" | parallel cjpeg -outfile LoRes/{} {}

这次压缩所有图像的时间缩减到了 0m10.814s。从 top 显示中可以很清楚地看出不同:

所有 CPU 核都满负荷运行,有 8 个线程对应使用 8 个 CPU 核。

parallel 与 gzip 连用

如果你需要压缩多个文件而不是一个大文件,那么 parallel 就能用来提高处理速度。如果你需要压缩单个文件而同时又想要利用所有的 CPU 核的话,那么你应该 gzip 的多线程替代品 pigz

首先,我用随机数据创建了 100 个大约 1GB 的文件:

for i in {1..100}; do dd if=/dev/urandom of=file-$i bs=1MB count=10; done

然而我用 find -exec 命令来进行压缩:

find . -type f -name "file*" -exec gzip {} ';'

总共耗时 0m28.028s,而且也是只利用了单核。

换成 parallel 版本:

find . -type f -name "file*" | parallel gzip {}

耗时减少到了 0m5.774s

parallel 是一款非常好用的工具,应该加入到你的系统管理工具包中,在合适的场合它能帮你节省大量的时间。


via: https://bash-prompt.net/guides/parallell-bash/

作者:Elliot Cooper 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

如何查看CentOS系统中...
掌控你的系统核心:CentOS查看CPU与内存信息指南 作为服务器...
2025-06-03 07:40:48
Lenovo Vantag...
问题 Lenovo Vantage是联想官方为联想电脑设计的国际版...
2025-06-01 20:38:16
2022年六大国产CPU发...
CPU 是底层硬件基础设施中的核心,当前主流芯片架构...
2025-05-31 05:37:45
Parallels Des...
环境:mbp m2 + Parallels ...
2025-05-29 19:34:25
计算机Intel CPU体...
前段meldown漏洞事件的影响,那段时间也正好在读...
2025-05-29 02:02:06
CPU也能跑千亿大模型,微...
提到模型部署,如果不提显存,貌似是对大模型的不尊重…. 多少参数对...
2025-04-25 13:47:08

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...