Gnu并行不使用所有的CPU

我有一个简单的Python脚本,从标准input读取(单行),做一些处理(stringparsing,没有涉及IO),并输出到标准输出

eg python parse.py < in.txt > out.txt 

我有一个200GB左右的in.txt ,并行加速(我有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 ps ax | grep python我得到不同的临时文件,我认为CPU浪费在处理这些临时文件? 还是我做错了什么?

虽然马克的答案是正确的,完全支持,你可能想要一个新的特点旋转。

 cat file | parallel --pipe ... 

最大值约为100 MB / s。

新的实验选项–pipepart提供> 2 GB / s,但要求in.txt是一个真正的(可search的)文件:

 parallel -a in.txt --block 100M --pipepart python parse.py 

-N1导致每行创build一个进程。 你正在看到并行设置的开销。 你应该改变python脚本来处理多行。 然后cat in.txt | parallel --pipe python parse.py cat in.txt | parallel --pipe python parse.py应该充分利用CPU。