我在群集(使用PBS)上运行内存不足的作业。我正在尝试在我的其他工作正在运行时分别打印每个节点的内存状态。我创建了一个shell脚本,并在我的作业提交脚本中包含了对该脚本的调用。但是当我提交我的工作时,它会在调用脚本的行上给我许可拒绝错误。我不明白为什么我会收到这个错误。
其次,我在想我可以在我的脚本文件中有一个“免费观看”或“观看ps aux”,但现在我在想,如果这会导致我提交的作业被卡在内存观看脚本中,从不继续到达调用我的并行程序的主线。
毕竟,我怎样才能在PBS中为我提交的工作记录我的记忆。我的代码是使用MRMPI(MPI MapReduce)库的C ++程序。
答案 0 :(得分:1)
要查看整个作业中使用的内存量,请运行qstat -f:
$ qstat -f | grep used
resources_used.cput = 00:02:51
resources_used.energy_used = 0
resources_used.mem = 6960kb
resources_used.vmem = 56428kb
resources_used.walltime = 00:01:26
要检查过去的工作,您可以在会计档案中查看。它位于server_priv / accounting目录中,默认为/ var / spool / torque / server_priv / accounting /.
条目如下所示:
09/14/2015 10:52:11;E;202.napali;user=dbeer group=company jobname=intense.sh queue=batch ctime=1442248534 qtime=1442248534 etime=1442248534 start=1442248536 owner=dbeer@napali exec_host=napali/0-2 Resource_List.neednodes=1:ppn=3 Resource_List.nodect=1 Resource_List.nodes=1:ppn=3 session=20415 total_execution_slots=3 unique_node_count=1 end=0 Exit_status=0 resources_used.cput=1989 resources_used.energy_used=0 resources_used.mem=9660kb resources_used.vmem=58500kb resources_used.walltime=995
答案 1 :(得分:0)
注意:如果您关闭群集计算节点的ssh访问权限,则此方法无效!
这就是我最终做到这一点的方式。它可能不是最好的方式,但它的工作原理: 总之,我在地图之间添加了一些短暂的睡眠时间,并通过调用c ++ sleep()函数来减少步骤。并且还编写了一个脚本ssh到我的作业运行的节点,然后在那些节点上获取内存状态(使用'free'或'top'命令)。
更详细:在我的PBS工作脚本中,在调用二进制文件之前的某个地方,我添加了这一行:
#this goes in job script, before the call to the job binary:
cat $PBS_NODEFILE > /some/path/nodelist.log
这会将我的作业运行的节点列表写入文件。
我有第二个脚本“watchmem.sh”:
#!/bin/bash
for i in $(seq 60)
do
while read line;
do
ssh $line 'bash -s' < /some/path/remote.sh "$line"
done < /some/path/nodelist.log
sleep 10
done
此脚本读取我们之前生成的文件nodelist.log,对每个节点执行ssh,并在每个节点上调用第三个(和最后一个脚本)remote.sh。
remote.sh包含我们在作业的每个节点上运行的命令。在这种情况下,它将当前时间和“free”的结果打印到每个节点的单独文件中:
#remote.sh
echo "Current time : $(date)" >> $1
free >> $1 #this can be replaced by top by specifying a -n for it
比较这些文件的时间和我从二进制文件打印的时间让我在每一步中找出内存消耗(alloc / dealloc)。 我的工作中的睡眠时间是确保我的脚本在两个步骤之间捕获内存状态。我的脚本中的'sleep 10'是为了避免对文件进行不必要的写入;这个时期应该与主要工作中的睡眠时间相当。