作为尝试加速系统中一些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
答案 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()
的调用,那些是大多数时间吃的人。尚不清楚(现在)为什么旧的二进制文件表现得那样。
我会发布更多信息。