当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    15分钟并行神器gnu parallel入门指南

    栏目:win服务器问题汇总 时间:2019-11-19 13:46

    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个云硬盘