Unix --并行=N未提供所需结果

Unix --并行=N未提供所需结果,unix,parallel-processing,Unix,Parallel Processing,我一直在使用normal和parallel run比较一个示例数据生成脚本。我使用GNU库“parallel”来并行运行脚本。该脚本在100个固定列中生成随机记录&行大小不同。下面是我生成随机记录的代码段: for i in $(seq $rows) do tr -dc A-Za-z0-9 < /dev/urandom | head -c 2000 > tmp gawk '$1=$1' FIELDWIDTHS='I put here the varying column length

我一直在使用normal和parallel run比较一个示例数据生成脚本。我使用GNU库“parallel”来并行运行脚本。该脚本在100个固定列中生成随机记录&行大小不同。下面是我生成随机记录的代码段:

for i in $(seq $rows)
do
tr -dc A-Za-z0-9 < /dev/urandom | head -c 2000 > tmp
gawk '$1=$1' FIELDWIDTHS='I put here the varying column lengths' OFS=, tmp >> tmp1
done
即使我使用“parallel”实用程序引入并行处理,与正常处理相比,我也看不到运行时间有任何变化。任何想法、见解和帮助都将不胜感激

我的CPU有4个核心,我想确保程序在执行时利用了所有的核心

谢谢,
阿迪尔有一个很好的观点。尝试:

cat /dev/urandom | pv > /dev/null
这能让数据足够快吗?如果没有,请尝试安装haveged


/dev/uradom
提供8位随机数据,但您只保留62个值,因此您将丢弃大量值。如果
/dev/uradom
是瓶颈,那么一个改进就是使用随机数据的全部值。如果你对随机值进行MIME编码,你将使用所有字节,得到6位值(=64个不同的值)。

我发现了错误,你会说DOH

您可以写信给>tmp。因此,如果您并行运行多个作业,您将一次又一次地覆盖此文件。解决方案是跳过tmpfile。通过这种方式,您可以匹配/dev/uradom的速度,这将成为瓶颈:

orig() {
  rows=$1
  for i in $(seq $rows)
  do
  tr -dc A-Za-z0-9 < /dev/urandom | head -c 2000 > tmp
  gawk '$1=$1' FIELDWIDTHS="$(seq 100|xargs)" OFS=, tmp >> tmp1
  done
}

rm tmp1
# Around 200 KB/s
(orig 1000; cat tmp1) | pv | wc -c

pipeversion() {
  rows=$1
  base64 -w 2000 < /dev/urandom | head -n $rows |
    gawk '$1=$1' FIELDWIDTHS="$(seq 100|xargs)" OFS=,;
}

# Around 12 MB/s
pipeversion 1000 | pv | wc -c

export -f pipeversion

# Around 12 MB/s - because /dev/urandom is the bottleneck
seq 100 | parallel pipeversion 1000 | pv | wc -c
orig(){
行=1美元
对于以美元为单位的i(seq$行)
做
tr-dc A-Za-z0-9tmp
gawk'$1=$1'字段宽度=“$(seq 100 | xargs)”OFS=,tmp>>tmp1
完成
}
tmp1室
#大约200 KB/s
(原1000;类别tmp1)| pv | wc-c
管道版本(){
行=1美元
base64-w 2000
您可能想确定瓶颈在哪里。Maxim,因为我没有使用任何手动过程在脚本中引入并行性,所以瓶颈标识本身就是一个瓶颈。然而,当脚本执行时,我可以看到mstat,所有的内核都在某个时刻被利用,但是%空闲时间的主要部分仍然较高(我会研究从
/dev/uradom
读取数据是如何伸缩的。
uradom
的优点是,当它的熵较低时,它不会阻塞。这也是一个缺点,因为这意味着你的随机数质量更差。如果你对随机数质量感到烦恼,那么你就不应该这样做,如果你不是……几乎是一个不管怎样,y RNG都可以;)使用/dev/uradom时,数据生成速率约为11MB/s。这很快。还没有使用MIME,我会尝试。但是回到问题,我仍然没有得到缓慢的性能。
orig() {
  rows=$1
  for i in $(seq $rows)
  do
  tr -dc A-Za-z0-9 < /dev/urandom | head -c 2000 > tmp
  gawk '$1=$1' FIELDWIDTHS="$(seq 100|xargs)" OFS=, tmp >> tmp1
  done
}

rm tmp1
# Around 200 KB/s
(orig 1000; cat tmp1) | pv | wc -c

pipeversion() {
  rows=$1
  base64 -w 2000 < /dev/urandom | head -n $rows |
    gawk '$1=$1' FIELDWIDTHS="$(seq 100|xargs)" OFS=,;
}

# Around 12 MB/s
pipeversion 1000 | pv | wc -c

export -f pipeversion

# Around 12 MB/s - because /dev/urandom is the bottleneck
seq 100 | parallel pipeversion 1000 | pv | wc -c