15分鐘神器gnu parallel 入門觀止

logo-gray+black300.png

這個cpu是多核的察皇。

一般兩核是這樣工作的的:

two core

四核是這樣工作的:

four core

16核是這樣工作的:

16 core

好了不黑了。再黑intel要打我了暴备。

在某個周末的早上百無聊賴之際围小,花了半天時間過了一遍gnu parallelman pagetutorial。哈哈酣衷,我得說這半天時間花的應(yīng)該挺值交惯,因?yàn)楦杏X以后它能為我節(jié)省的時間不止半天吧。

本文并不會嘗試去翻譯 gnu parallel的man page或者tutorial穿仪。因?yàn)楝F(xiàn)成的翻譯已經(jīng)有了席爽,可以看這里,或者這里啊片。

但是我前幾次看到 parallel詭異的幾個:::以及奇奇怪怪的 {}{#}{.}{\}占位符之后就打起了退堂鼓只锻,如此丑陋的語法令人無愛啊。還好直接看了一下幾個example壓壓驚紫谷,動手試一把齐饮,才發(fā)現(xiàn)實(shí)乃神器也。

本文主要的目的是安利(lure)你使用這個工具碴里,并且告訴你為啥(why)使用和如何(how)使用沈矿。

why

使用gnu parallel的目的只要一個,就是為了快咬腋!

安裝快

(wget -O - pi.dk/3 || curl pi.dk/3/) | bash

作者說10秒裝好羹膳。在國內(nèi)實(shí)際情況可能不夠。但是也不用太久根竿。其實(shí)就是一個1萬多行perl單文件腳本(是的陵像,你沒看錯就珠,所有模塊都在這個文件里,這是一個特色~)醒颖。我之后都是寫fabric腳本直接拷貝到各個節(jié)點(diǎn)機(jī)妻怎。再chmod一下執(zhí)行權(quán)限。

然后是執(zhí)行快泞歉,它將你的程序并行利用系統(tǒng)的多核執(zhí)行:

上圖:

Paste_Image.png

grep 一個 1G 大小的log逼侦。

使用parallel ,和不使用parallel直接grep腰耙。結(jié)果顯而易見榛丢,相差 20 倍。這比用啥 ack挺庞,ag優(yōu)化效果明顯多了晰赞。

備注:這是在一個48 核服務(wù)器上執(zhí)行的結(jié)果。

how

最簡單的方法就是類比xargs选侨。在xargs里面有一個參數(shù) -P掖鱼,可以利用多核。

舉個例子:

$ time echo {1..5} |xargs -n 1  sleep

real    0m15.005s
user    0m0.000s
sys 0m0.000s

這一條xargs把每個echo的數(shù)作為參數(shù)傳給sleep 援制,所以一共sleep了 1+2+3+4+5=15秒戏挡。

如果使用 -P 參數(shù)分給5個核,每個核各sleep 1,2,3,4,5秒隘谣,所以執(zhí)行完之后總共sleep的5秒增拥。

$ time echo {1..5} |xargs -n 1 -P 5 sleep

real    0m5.003s
user    0m0.000s
sys 0m0.000s

鋪墊結(jié)束。一般情況下寻歧,parallel的第一種模式掌栅,就是替換掉 xargs -P.

比如壓縮一下所有的html文件。

find . -name '*.html' | parallel gzip --best

傳參數(shù)模式

第一種模式是利用 parallel傳參數(shù)码泛。管道前面進(jìn)來的作為參數(shù)傳給后面的命令猾封,并行執(zhí)行

比如

huang$ seq 5 | parallel echo pre_placehoder_{}
pre_placehoder_1
pre_placehoder_2
pre_placehoder_3
pre_placehoder_4
pre_placehoder_5

其中{}是占位符,用來占位傳入?yún)?shù)的位置噪珊。

在云計(jì)算操作中晌缘,經(jīng)常有批量操作,比如建立10個云硬盤

seq 10 | parallel  cinder create 10 --display-name test_{}

建立50個云主機(jī)

seq 50 | parallel nova boot --image    image_id  --flavor 1 --availability-zone  az_id   --nic vnetwork=private   --vnc-password 000000  vm-test_{}

批量刪除云主機(jī)

nova list | grep some_pattern| awk '{print $2}' | parallel nova delete

改寫 for loop

可以看到痢站,我其實(shí)是把很多需要寫循環(huán)的地方用parallel替換了磷箕,順帶享受了并行帶來的快捷。

這個道理是這樣的阵难,在進(jìn)行for循環(huán)的時候岳枷,是最有可能并行化的,因?yàn)楸环旁谘h(huán)中的各個對象是上下文無關(guān)的。

普世抽象空繁,shell的循環(huán):

  (for x in `cat list` ; do
    do_something $x
  done) | process_output

可以直接寫成

 cat list | parallel do_something | process_output

如果loop 里面內(nèi)容太多了

 (for x in `cat list` ; do
    do_something $x
    [... 100 lines that do something with $x ...]
  done) | process_output

那么最好寫成一個腳本

  doit() {
    x=$1
    do_something $x
    [... 100 lines that do something with $x ...]
  }
  export -f doit
  cat list | parallel doit

而且還能避免掉很多麻煩的轉(zhuǎn)義殿衰。

--pipe模式

另一種模式就是 parallel --pipe

這時管道前面的不是作為參數(shù),而是標(biāo)準(zhǔn)輸入傳給后面的命令

例如:

 cat my_large_log   |parallel --pipe grep pattern 

如果不加 --pipe 盛泡,相當(dāng)于 mylog中的每一行都變成 grep pattern line的命令展開了闷祥。而加入了--pipe,則和 cat mylog | grep pattern 沒有區(qū)別傲诵,只是分配到各個核上去執(zhí)行了凯砍。

好了,基本概念就講完了拴竹!其他的都只是各個參數(shù)具體使用果覆,比如到底用幾個核啊,place_holder的替換啊殖熟,各種花樣傳參數(shù)啊,并行執(zhí)行但是保證結(jié)果順序輸出(-k)斑响,以及神奇的跨節(jié)點(diǎn)并行計(jì)算啊菱属,看看man page就知道了。

bonus

手邊有了一個轉(zhuǎn)換成并行的小工具舰罚,除了讓你日常執(zhí)行快一點(diǎn)之外纽门,還有一個好處,就是測并發(fā)营罢。

很多接口在并發(fā)操作下會出現(xiàn)一些bug赏陵,比如有一些判斷數(shù)據(jù)庫里面沒有加鎖,是在代碼層面判斷的饲漾,結(jié)果并發(fā)請求下去蝙搔,每個請求在到達(dá)服務(wù)器的時候是判斷通過,一起寫了之后就超出限制了考传。之前寫for循環(huán)因?yàn)槭谴袌?zhí)行的吃型,并不會觸發(fā)這些問題。但是你要真正測并發(fā)的話僚楞,又要寫腳本勤晚,或者利用python的mulitiprocessing封裝一下。但我手邊有了parallel泉褐,又在bashrc里面就加了以下兩個alias

alias p='parallel'
alias pp='parallel --pipe -k'   

這樣制造并發(fā)太方便了赐写,只需要管道后面加個p , 我就時時刻刻可以制造并發(fā)來觀察響應(yīng)。

舉個例子

seq 50 | p -n0 -q  curl 'example.com'

以你核的個數(shù)并發(fā)請求膜赃。-n0的意思是seq輸出不作為參數(shù)傳給后面的命令挺邀。

八卦時間:gnu界的祥林嫂

作為一個自由軟件八卦愛好者,每次我發(fā)現(xiàn)一個新奇的軟件總會去 google一下 關(guān)鍵詞 site:https://news.ycombinator.com關(guān)鍵詞 site:http://www.reddit.com/∮坪唬看看風(fēng)評如何癌淮,并且往往還能在討論中有意外收獲。

然后我再hacker news上看到了一段吐槽沦补,主要就是說每次觸發(fā)執(zhí)行parallel都會彈出一段文字和你說乳蓄,要是你把這個工具用在學(xué)術(shù)上的話(很多生命科學(xué)相關(guān)的都在用這個工具的),要引用他的論文夕膀,不然的話你就付他10000歐元吧虚倒。我因此學(xué)到一個詞,叫Nagware产舞,特指通過啰啰嗦嗦像唐僧那樣煩你要你付錢的軟件魂奥。雖然我認(rèn)為真用到了的確也應(yīng)該引用一下文章,但是易猫,如同這位同學(xué)說的:

I agree it's a great tool, except for the nagware messages and their content. Imagine if the author of cd or ls had the same attitude...

另外耻煤,該作者真是灰常喜歡別人引用他的軟件,以致于在NEWS里面我還看到了:

Paste_Image.png

(update)


image.png

這篇文章本身也被收錄了准颓,雖然收錄的是個轉(zhuǎn)載地址 :(

原理時間

直接摘抄一下作者在 stackoverflow 的回答

GNU Parallel is a general parallelizer and makes is easy to run jobs in parallel on the same machine or on multiple machines you have ssh access to.

If you have 32 different jobs you want to run on 4 CPUs, a straight forward way to parallelize is to run 8 jobs on each CPU:

Paste_Image.png

GNU Parallel instead spawns a new process when one finishes - keeping the CPUs active and thus saving time:

Paste_Image.png

結(jié)論

本文主要安利了一個 真 - 并行 工具哈蝇,解釋了其主要的兩種模式,附贈了一個技巧攘已,八卦了gnu界不為人知的另一面炮赦。希望對你有用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末样勃,一起剝皮案震驚了整個濱河市吠勘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌峡眶,老刑警劉巖剧防,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辫樱,居然都是意外死亡诵姜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門搏熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棚唆,“玉大人,你說我怎么就攤上這事心例∠瑁” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵止后,是天一觀的道長瞎惫。 經(jīng)常有香客問我溜腐,道長,這世上最難降的妖魔是什么瓜喇? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任挺益,我火速辦了婚禮,結(jié)果婚禮上乘寒,老公的妹妹穿的比我還像新娘望众。我一直安慰自己,他們只是感情好伞辛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布烂翰。 她就那樣靜靜地躺著,像睡著了一般蚤氏。 火紅的嫁衣襯著肌膚如雪甘耿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天竿滨,我揣著相機(jī)與錄音佳恬,去河邊找鬼。 笑死殿怜,一個胖子當(dāng)著我的面吹牛墓贿,可吹牛的內(nèi)容都是我干的切平。 我是一名探鬼主播眠蚂,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸠澈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起截驮,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤笑陈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后葵袭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涵妥,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年坡锡,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓬网。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹉勒,死狀恐怖帆锋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禽额,我是刑警寧澤锯厢,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布皮官,位于F島的核電站,受9級特大地震影響实辑,放射性物質(zhì)發(fā)生泄漏捺氢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一剪撬、第九天 我趴在偏房一處隱蔽的房頂上張望摄乒。 院中可真熱鬧,春花似錦婿奔、人聲如沸缺狠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挤茄。三九已至,卻和暖如春冰木,著一層夾襖步出監(jiān)牢的瞬間穷劈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工踊沸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歇终,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓逼龟,卻偏偏與公主長得像评凝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腺律,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容