【问题标题】:What's causing the overhead when running jobs in the background?在后台运行作业时导致开销的原因是什么?
【发布时间】:2015-10-19 20:01:43
【问题描述】:

作为加速系统中某些 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,然后读取单个

这是我用来并行执行调用的 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

【问题讨论】:

  • 它使用了多少内存?这些症状看起来像是在颠簸。
  • 在执行这两个测试时尝试在另一个窗口中运行vmstat 1
  • 它正在读取的文件有多大?
  • 您能展示一下您是如何执行循环和非循环脚本的吗?
  • 看来内存使用不是问题,运行脚本前的可用内存为 12512256,执行脚本时达到的最低值是 12277468。

标签: linux bash process parallel-processing


【解决方案1】:

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

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

这应该可以让你找到正在吞噬你记忆的东西(如果有的话)。


编辑:

较小的进程调用报告了这一点(随着时间的推移):
wall: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() 的调用,而且大多数时间都是那些在吃东西的人。尚不清楚(目前)为什么旧的二进制文件会这样。

我会发布更多信息。

【讨论】:

  • wall: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) 并行运行作业
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
相关资源
最近更新 更多