Linux
Gnu 並行不使用所有 CPU
我有一個簡單的 python 腳本,它從標準輸入(單行)讀取,進行一些處理(字元串解析,不涉及 IO)並輸出到標準輸出
e.g. python parse.py < in.txt > out.txt
我有一個
in.txt
大約 200GB 的大小,我使用並行來加速它(我有 8 個 CPU 核心)。cat in.txt | parallel -j8 -N1 --pipe python parse.py
我觀察到的 CPU 是它們沒有充分利用,例如
%Cpu0 : 9.1 us, 22.7 sy, 0.0 ni, 68.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 : 27.3 us, 13.6 sy, 0.0 ni, 59.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu2 : 14.3 us, 71.4 sy, 0.0 ni, 14.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 : 14.3 us, 28.6 sy, 0.0 ni, 57.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu4 : 14.3 us, 38.1 sy, 0.0 ni, 47.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu5 : 4.8 us, 23.8 sy, 0.0 ni, 71.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu6 : 15.0 us, 20.0 sy, 0.0 ni, 65.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu7 : 23.8 us, 19.0 sy, 0.0 ni, 57.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
和
ps ax | grep python
我有
12450 ? S 0:00 /bin/bash -c sh -c 'dd bs=1 count=1 of=/tmp/2NQLo8j4qy.chr 2>/dev/null'; test ! -s "/tmp/2NQLo8j4qy.chr" && rm -f "/tmp/2NQLo8j4qy.chr" && exec true; (cat /tmp/2NQLo8j4qy.chr; rm /tmp/2NQLo8j4qy.chr; cat - ) | (python parse.py); 12453 ? S 0:00 /bin/bash -c sh -c 'dd bs=1 count=1 of=/tmp/zYnfr4Ss8H.chr 2>/dev/null'; test ! -s "/tmp/zYnfr4Ss8H.chr" && rm -f "/tmp/zYnfr4Ss8H.chr" && exec true; (cat /tmp/zYnfr4Ss8H.chr; rm /tmp/zYnfr4Ss8H.chr; cat - ) | (python parse.py); 12456 ? S 0:00 /bin/bash -c sh -c 'dd bs=1 count=1 of=/tmp/wlrI14juYz.chr 2>/dev/null'; test ! -s "/tmp/wlrI14juYz.chr" && rm -f "/tmp/wlrI14juYz.chr" && exec true; (cat /tmp/wlrI14juYz.chr; rm /tmp/wlrI14juYz.chr; cat - ) | (python parse.py); 12459 ? S 0:00 /bin/bash -c sh -c 'dd bs=1 count=1 of=/tmp/cyArLNBTTm.chr 2>/dev/null'; test ! -s "/tmp/cyArLNBTTm.chr" && rm -f "/tmp/cyArLNBTTm.chr" && exec true; (cat /tmp/cyArLNBTTm.chr; rm /tmp/cyArLNBTTm.chr; cat - ) | (python parse.py); 12461 pts/0 S+ 0:00 grep --color=auto python 15211 ? S 144:22 perl /usr/bin/parallel -j8 -N1 --pipe python parse.py
每次我執行時都會
ps ax | grep python
得到不同的臨時文件,我認為 CPU 浪費在處理這些臨時文件上?還是我做錯了什麼?
雖然 Mark 的回答是正確的並且得到完全支持,但您可能想嘗試一下新功能。
cat file | parallel --pipe ...
最大速度約為 100 MB/s。
新的實驗選項 –pipepart 提供 > 2 GB/s,但要求 in.txt 是一個真實的(可搜尋的)文件:
parallel -a in.txt --block 100M --pipepart python parse.py
這
-N1
導致每行創建一個程序。您會看到並行設置的成本。您應該更改 python 腳本以處理多行。然後cat in.txt | parallel --pipe python parse.py
應該充分利用CPU。