充分利用您的X-Core CPU

充分利用您的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.
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏