在后台运行作业时导致开销的原因是什么?

时间:2015-10-19 20:01:43

标签: linux bash process parallel-processing

作为尝试加速系统中一些CPU密集型处理的一部分,我正在寻求并行化对外部二进制文件的昂贵调用。在多个进程中运行这个二进制文件比我预期的要多得多,我想帮助找出它来自哪里。

在一台8核机器上,当我在bash中循环运行6次调用时,它的时间如下:

real    0m7.034s
user    0m6.798s
sys     0m0.199s

当我执行相同的循环,但指示在后台运行&后跟wait的呼叫时,它的时间如下:

real    0m9.824s
user    0m54.048s
sys     0m0.458s

二进制文件读取一些不变的数据文件21M&然后,164K读取单个输入文件< 1K,执行CPU密集型计算,并将结果写入stdout。什么可以提供足够的开销,以便并行运行它们的速度较慢?

这是我用来并行执行调用的bash脚本。对于顺序行为,它是相同的,除了if块消失了和&从命令中删除。

SPAWN_COUNT=6
for i in 1 2 3 4 5 6; do
    /opt/netMHCpan-2.8/netMHCpan /tmp/test_input -ic50 -a BoLA-D18.4 -l 10 > /dev/null &
    NPROC=$(($NPROC+1))
    if [ "$NPROC" -ge "$SPAWN_COUNT" ]; then
        wait
        NPROC=0
    fi
done

1 个答案:

答案 0 :(得分:0)

将过程分成更小的部分 将每个较小的部分设为可执行文件(甚至是带有chmod u+x $script的脚本)并随时间测量内存使用情况:

tf='wall:%e s:%S u:%U (%Xtext+%Ddata %F %p %t %Kmem %Mmax)'
/usr/bin/time -f "$tf" "$script"

那应该让你找到吃你的记忆的东西(如果有的话)。

编辑:

较小的流程调用报告了此(随着时间的推移):
墙:1.08 s:0.03 u:1.05(0text + 0data 0 0 0 0mem 11844max)一个实例
wall:8.89 s:0.41 u:48.93(0text + 0data 0 0 0 0mem 11848max)并行工作

内存不是问题,仅使用11.85兆。

使用strace(strace -c脚本)显示有wait()的调用,那些是大多数时间吃的人。尚不清楚(现在)为什么旧的二进制文件表现得那样。

我会发布更多信息。