在 PBS 中观察内存

watching memory in PBS

我 运行 集群上的一项作业(使用 PBS)内存不足。我正在尝试分别打印每个节点的内存状态,而我的另一项工作是 运行。我创建了一个 shell 脚本,并在我的作业提交脚本中包含对该脚本的调用。但是当我提交我的工作时,它在调用脚本的行上给了我权限被拒绝的错误。我不明白为什么会出现该错误。

其次,我在想我的脚本文件中可以有一个 'watch free' 或 'watch ps aux',但现在我在想这是否会导致我提交的作业卡在内存监视中脚本,永远不会继续进入调用我的并行程序的主线。

毕竟,我如何才能在 PBS 中记录我提交的作业的内存。我的代码是一个使用 MRMPI (MPI MapReduce) 库的 C++ 程序。

要查看整个作业中使用了多少内存,运行 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

注意:如果关闭了集群计算节点的ssh访问权限,则此方法无效!

我就是这样完成的。这可能不是最好的方法,但它有效: 总之,我通过调用 c++ sleep() 函数在我的地图和减少步骤之间添加了一些较短的睡眠时间。并且还编写了一个脚本,该脚本通过 ssh 连接到我的工作 运行ning 上的节点,然后获取这些节点上的内存状态,将它们写入文件(使用 '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)" >> 
free >>   #this can be replaced by top by specifying a -n for it

比较这些文件的时间和我从二进制文件打印的时间,让我找出每个步骤中的内存消耗 (alloc/dealloc)。 我工作中的睡眠时间是为了确保我的脚本捕获步骤之间的内存状态。 'sleep 10' 在我的脚本中是为了避免对文件进行不必要的写入;这段时间应该和主业的睡眠时间差不多