充分利用您的X核心CPU
现在几乎所有的系统至少都有一个双核CPU,即使三核或四核也越来越便宜,越来越标准。 但是如何利用您的闪存x内核来充分发挥潜力,应用程序只能使用一个核心? 使用具有强大的多任务功能的Linux作为所有Unixoid操作系统,通常只能使用x内核CPU的一个核心来并行化并行化任务。
你应该熟悉在shell中工作,因为所有的工作都在那里完成。 没有浏览器,没有花哨的GUI,没有眼睛。
免责声明
以下文章介绍了我安装和使用该软件的方式,我不会保证以同样的方式为您服务。
并行处理Shell脚本
此脚本托管在http://code.google.com/p/ppss/上 。 它根据BSD许可条款发布,更改为版本2.55的GPL。 它不包装在受欢迎的Linux发行版的存储库中,因此必须手动安装。
有一个关于托管网站的完整详细的文档,脚本可以从那里以档案形式下载。 由于存档中只有脚本,我将存档解包到/ usr / local / bin,检查它是否属于root,并且是全局读取和可执行的:
wget http://ppss.googlecode.com/files/ppss-2.50.tgz
tar xvzf ppss-2.50.tgz -C /usr/local/bin
chown root:root /usr/local/bin/ppss.sh && chmod a+rx /usr/local/bin/ppss.sh
ls -l /usr/local/bin/ppss.sh
-rwxr-xr-x 1根根54612 2009-12-17 16:40 /usr/local/bin/ppss.sh*
除bash之外的要求只是mkfifo命令。 mkfifo通常在GNU coreutils包中。 由于我们在没有软件包管理器的情况下进行安装,因此显而易见的是,您需要手动注意所有的依赖关系都被解决。 ppss.sh不仅在Linux上运行,而且在Mac OS X上也可以运行在* BSD上。
当你尝试调用它没有任何参数应该显示它的帮助屏幕:
$ ppss.sh |P|P|S|S| Distributed Parallel Processing Shell Script 2.50 usage: /usr/local/bin/ppss.sh [ -d | -f ] [ -c ' "$ITEM"' ] [ -C ] [ -j ] [ -l ] [ -p <# jobs> ] [ -D ] [ -h ] [ --help ] Examples: /usr/local/bin/ppss.sh -d /dir/with/some/files -c 'gzip ' /usr/local/bin/ppss.sh -d /dir/with/some/files -c 'gzip "$ITEM"' -D 5 /usr/local/bin/ppss.sh -d /dir/with/some/files -c 'cp "$ITEM" /tmp' -p 2
对于ppss.sh的基本用法,我们不需要配置任何东西,因为脚本足够聪明,可以分析其运行的机器的CPU的内核数量。
例子
一个非常适合与ppss.sh并行化的工作,当你想将一堆.flac文件转换为例如oggvorbis文件时,用于监听便携式播放器。 这可以很容易地在for循环中完成,我们很幸运oggenc能够读取.flac文件:
for i in *.flac; do oggenc -q3 -o ${i%%flac}ogg $i; done
这是顺序的方法,只使用一个x内核。 这可以通过发出一个
top -n1在另一个窗口中,转换正在运行:
Tasks: 112 total, 2 running, 110 sleeping, 0 stopped, 0 zombie Cpu(s): 56.9%us, 0.6%sy, 0.0%ni, 41.2%id, 1.1%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 4062968k total, 2303836k used, 1759132k free, 36268k buffers Swap: 522072k total, 0k used, 522072k free, 1558228k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7248 root 20 0 19780 2604 1468 R 88 0.1 0:05.02 oggenc ...
我们尝试用ppss.sh来并行化它:
ppss.sh -d /path/to/your/flacfiles/ -c 'oggenc $ITEM -q3 -o "${ITEM%%.flac}.ogg"'
而不是循环变量我不得不使用由ppss.sh预设为“循环”变量的变量ITEM。 我们在屏幕上得到以下输出:
Feb 03 20:16:00: ========================================================= Feb 03 20:16:00: |P|P|S|S| Feb 03 20:16:00: Distributed Parallel Processing Shell Script version 2.50 Feb 03 20:16:00: ========================================================= Feb 03 20:16:00: Hostname: xxxxx Feb 03 20:16:00: --------------------------------------------------------- Feb 03 20:16:00: CPU: AMD Athlon(tm) Dual Core Processor 4850e Feb 03 20:16:00: Found 2 logic processors. Feb 03 20:16:00: Starting 2 parallel workers. Feb 03 20:16:00: --------------------------------------------------------- Feb 03 20:17:00: Currently 100 percent complete. Processed 7 of 7 items. Feb 03 20:17:00: 1 job is remaining. Feb 03 20:17:34: Finished. Consult ./ppss/job_log for job output.
另一个
top -n1显示所有内核都被使用:
Tasks: 117 total, 3 running, 114 sleeping, 0 stopped, 0 zombie Cpu(s): 99.4%us, 0.6%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 4062968k total, 2070004k used, 1992964k free, 38916k buffers Swap: 522072k total, 0k used, 522072k free, 1709844k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10933 root 20 0 19856 2600 1468 R 99 0.1 0:06.20 oggenc 10854 root 20 0 19856 2600 1468 R 87 0.1 0:08.51 oggenc ...另一个例子是将相同的.flac文件转换为.mp3。这有点复杂,因为我们需要flac来解码.flac文件并对其进行编码。这可以在for循环中顺序进行,将flac的stdout引导到跛脚的标签:
for file in *.flac; do $(flac -cd "$file" | lame -h - "${file%.flac}.mp3"); done
另一个
top -n1显示仅使用一个核心:
Tasks: 118 total, 3 running, 115 sleeping, 0 stopped, 0 zombie Cpu(s): 99.3%us, 0.7%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 4062968k total, 2080004k used, 1982964k free, 37926k buffers Swap: 522072k total, 0k used, 522072k free, 1709844k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17837 root 20 0 19856 2600 1468 R 99 0.1 0:04.70 oggenc ...
同样由ppss.sh平行化:
ppss.sh -d /path/to/flacfiles -c 'flac -cd "$ITEM" | lame -V 4 -B 160 - "${ITEM%.flac}.mp3"'
这里
top -n1表明两个核心几乎具有充分的潜力:
Tasks: 129 total, 3 running, 126 sleeping, 0 stopped, 0 zombie Cpu(s): 98.2%us, 1.7%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.2%hi, 0.0%si, 0.0%st Mem: 4062968k total, 2629956k used, 1433012k free, 33996k buffers Swap: 522072k total, 0k used, 522072k free, 1890244k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7287 root 20 0 14788 2480 1124 R 93 0.1 0:13.41 lame 7210 root 20 0 14788 2484 1124 R 89 0.1 0:23.59 lame 7209 root 20 0 15776 1060 792 S 7 0.0 0:01.67 flac 7286 root 20 0 15776 1064 792 S 6 0.0 0:00.95 flac
最后一个例子(处理声音文件)是将一些用320kBit编码的.mp3文件缩小到128kBit VBR,再次为便携式播放器节省宝贵的空间。 这可以用跛脚来完成,没有前面例子中的解码器的帮助:
for i in *.mp3; do lame -V 4 -B 160 - "${i%.flac}.mp3"'; done
与ppss.sh并行化看起来像
ppss.sh -d /path/to/320kBit/mp3_files -c 'lame $ITEM -V 4 -B 160 "${ITEM%.mp3}.downmp3"'
看起来像
Tasks: 132 total, 3 running, 129 sleeping, 0 stopped, 0 zombie Cpu(s): 98.8%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 4062968k total, 2441644k used, 1621324k free, 37068k buffers Swap: 522072k total, 0k used, 522072k free, 1671080k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9073 root 20 0 14792 2724 1248 R 98 0.1 0:10.80 lame 8994 root 20 0 14788 2720 1248 R 98 0.1 0:15.57 lame
因为我们不喜欢覆盖320kBit文件,所以我们简单地给下采样文件扩展名为.downmp3。 下采样完成后,您可以使用mmv移动下采样文件:
mmv "*.downmp3" "/new/path/#1.mp3"
所以你重命名文件,并用一个命令把它们移动到别处。 mmv,顺便说一句,应该是最常见的分发版本库。
ppss.sh的另一个特点是您可以使用一个文件来提供要处理的项目。 说你有一个很多图片的目录,你首先要用feh作为图像查看器查看所有图片,并使用feh的文件列表功能来选择一些文件供以后处理。 应该使用ImageMagick进行处理,ImageMagick具有很多过滤和操作图像的功能。 由于图像的操纵可能是cpu密集型的,这完全适合于ppss.sh。
feh的文件列表看起来像
/path/to/images/1.png /path/to/images/3.png /path/to/images/17.png ... /path/to/images/13815.png
它使用-f filelist命令行参数生成。 您可以在feh中按<DELETE>键从文件列表中删除图像。 不幸的是,绝对路径不能与ppss.sh一起使用,但是feh本身可以将它的文件列表转换为适合ppss.sh的文件列表:
feh *.png -f feh_list -L %n > ppss_list
或awk:
cat feh_list | awk -F/ '{ print $NF }' > ppss_list
假设您想要对所有这些选定的文件进行一些真正的时间过滤。 使用ImageMagick,您不能使用feh的文件列表,如果要处理整个目录,可以使用上述for循环方法。 使用feh,您还可以构建递归的文件列表,无法在ImageMagick的简单for循环中处理。 但是回到这个例子,现在你有一个文件列表,你可以像这样漂亮的过滤器
ppss.sh -f ppss_list -d /path/to/images -c 'mogrify -solarize 50 "$ITEM"'
(我只做一个太阳能,但你得到的想法)。
在屏幕上你看到ppss工作:
Feb 03 15:06:06: ========================================================= Feb 03 15:06:06: |P|P|S|S| Feb 03 15:06:06: Distributed Parallel Processing Shell Script version 2.50 Feb 03 15:06:06: ========================================================= Feb 03 15:06:06: Hostname: xxxxxxxx Feb 03 15:06:06: --------------------------------------------------------- Feb 03 15:06:06: CPU: Intel(R) Core(TM)2 Duo CPU T5470 @ 1.60GHz Feb 03 15:06:06: Found 2 logic processors. Feb 03 15:06:06: Starting 2 parallel workers. Feb 03 15:06:06: --------------------------------------------------------- Feb 03 15:06:17: Currently 100 percent complete. Processed 65 of 65 items. Feb 03 15:06:17: 1 job is remaining. Feb 03 15:06:17: Finished. Consult ./ppss/job_log for job output.