当前位置 主页 > 服务器问题 > win服务器问题汇总 >
GNU Parallel是一个shell工具,为了在一台或多台计算机上并行的执行计算任务。本文简要介绍GNU Parallel的使用。
这个cpu是多核的。
一般两核是这样工作的的:
四核是这样工作的:
16核是这样工作的:
好了不黑了。再黑intel要打我了。
在某个周末的早上百无聊赖之际,花了半天时间过了一遍gnu parallel的man page和tutorial。哈哈,我得说这半天时间花的应该挺值,因为感觉以后它能为我节省的时间不止半天吧。
本文并不会尝试去翻译gnu parallel的man page或者tutorial。因为现成的翻译已经有了,可以看这里,或者这里。
但是我前几次看到 parallel诡异的几个:::以及奇奇怪怪的 {}{#}{.}{\}占位符之后就打起了退堂鼓,如此丑陋的语法令人无爱啊。还好直接看了一下几个example压压惊,动手试一把,才发现实乃神器也。
本文主要的目的是安利(lure)你使用这个工具,并且告诉你为啥(why)使用和如何(how)使用。
why
使用gnu parallel的目的只要一个,就是为了快!
安装快
(wget -O - pi.dk/3 || curl pi.dk/3/) | bash
作者说10秒装好。在国内实际情况可能不够。但是也不用太久。其实就是一个1万多行perl单文件脚本(是的,你没看错,所有模块都在这个文件里,这是一个特色~)。我之后都是写fabric脚本直接拷贝到各个节点机。再chmod一下执行权限。
然后是执行快,它将你的程序并行利用系统的多核执行:
上图:
grep 一个 1G 大小的log。
使用parallel ,和不使用parallel直接grep。结果显而易见,相差 20 倍。这比用啥 ack,ag优化效果明显多了。
备注:这是在一个48 核服务器上执行的结果。
how
最简单的方法就是类比xargs。在xargs里面有一个参数 -P,可以利用多核。
举个例子:
$ time echo {1..5} |xargs -n 1 sleep real 0m15.005s user 0m0.000s sys 0m0.000s
这一条xargs把每个echo的数作为参数传给sleep ,所以一共sleep了 1+2+3+4+5=15秒。
如果使用 -P 参数分给5个核,每个核各sleep 1,2,3,4,5秒,所以执行完之后总共sleep的5秒。
$ time echo {1..5} |xargs -n 1 -P 5 sleep real 0m5.003s user 0m0.000s sys 0m0.000s
铺垫结束。一般情况下,parallel的第一种模式,就是替换掉 xargs -P.
比如压缩一下所有的html文件。
find . -name '*.html' | parallel gzip --best
传参数模式
第一种模式是利用 parallel传参数。管道前面进来的作为参数传给后面的命令,并行执行
比如
huang$ seq 5 | parallel echo pre_placehoder_{} pre_placehoder_1 pre_placehoder_2 pre_placehoder_3 pre_placehoder_4 pre_placehoder_5
其中{}是占位符,用来占位传入参数的位置。
在云计算操作中,经常有批量操作,比如建立10个云硬盘