【问题标题】:watching memory in PBS在 PBS 中观看记忆
【发布时间】:2015-09-30 05:40:23
【问题描述】:

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

其次,我在想我可以在我的脚本文件中有一个“免费观看”或“观看 ps aux”,但现在我在想这是否会导致我提交的作业卡在内存监视脚本中并且永远不会继续到调用我的并行程序的主线。

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

【问题讨论】:

  • 您只使用节点吗?如果是这样,您可以使用 PBS 本身收集的内存使用信息,这似乎比在脚本中复制此功能要容易得多。
  • 如何访问 PBS 收集的信息?此外,我不仅想要最终报告,还需要查看在运行程序期间内存消耗如何变化。我想看看我的程序中是哪个 Map 或 Reduce 函数导致了问题。
  • Ups,抱歉,我没有检查 pbsnodes -a 的输出中可用的信息。在扭矩status 字段中仅报告负载平均值,在PBS Pro 中仅报告assigned.mem

标签: memory pbs


【解决方案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

【讨论】:

  • 谢谢。 qstat -f 在我的作业运行时不显示任何统计信息,直到它完成(内存不足),只需要几秒钟,然后它会显示该时间段内的完整内存使用情况..(可能是因为它只需要几秒钟 pbs 在我遇到错误并终止之前不会更新数据?)我需要看看它在作业运行时每秒如何变化。另外我无权访问 server_priv 目录,给我权限被拒绝错误。
  • 使用信息默认每45秒更新一次,所以只有几秒钟的东西直到工作结束才会得到它。记帐日志也仅在作业之后。要每秒获得这种东西,您需要做一些自定义的事情。
【解决方案2】:

注意:如果您对集群计算节点的 ssh 访问关闭,此方法将不起作用!

这就是我最终这样做的方式。这可能不是最好的方法,但它有效: 总之,我通过调用 c++ sleep() 函数在我的 map 和 reduce 步骤之间添加了一些短的睡眠时间。并且还编写了一个脚本,将 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”是为了避免对文件进行不必要的写入;这段时间应该与主作业中的睡眠持续时间相当。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多