如何测量Sun Grid Engine中整批作业的完成耗时?
用qacct计算SGE整批作业的总Wall Time
当然可以用qacct来搞定这个需求——它本身没有直接输出整批作业的总耗时,但我们可以换个思路,提取每个作业的关键时间点,自己计算出你要的两种时间范围:从最早提交到最后完成,或者从第一个作业启动到最后一个完成。
核心思路
qacct会输出每个作业的三个关键时间戳(均为Unix秒数格式):
qsub_time:作业提交到队列的时间start_time:作业实际开始运行的时间end_time:作业完成的时间
我们只需要找到整批作业中的这几个极值:
- 最小的
qsub_time(最早提交的作业)和最大的end_time(最晚完成的作业),两者差值就是「从提交到队列清空」的总耗时 - 最小的
start_time(第一个启动的作业)和最大的end_time,差值就是「从第一个启动到最后完成」的总耗时
具体命令示例
假设你的整批作业有统一的命名前缀(比如my_batch_job_),可以用下面的awk脚本一次性计算两种时间:
qacct -j '*my_batch_job*' | awk ' /^qsub_time/ { qsub = $NF if (min_qsub == "" || qsub < min_qsub) min_qsub = qsub } /^start_time/ { start = $NF if (min_start == "" || start < min_start) min_start = start } /^end_time/ { end = $NF if (max_end == "" || end > max_end) max_end = end } END { # 计算秒数并转成时分秒格式 total_submit = max_end - min_qsub total_start = max_end - min_start printf "从最早提交到最后完成的总耗时: %dh%dm%ds\n", total_submit/3600, (total_submit%3600)/60, total_submit%60 printf "从第一个启动到最后完成的总耗时: %dh%dm%ds\n", total_start/3600, (total_start%3600)/60, total_start%60 }'
如果你的作业是用任务数组提交的(比如qsub -t 1-50 my_script.sh),直接用数组的主作业ID代替前缀即可:
qacct -j <你的数组作业ID> | awk '...' # 后面的awk脚本和上面一致
注意事项
- 权限问题:普通用户只能用
qacct查询自己提交的作业,若需要查看其他用户的作业,得用管理员权限执行 - 时间戳格式:
qacct输出的时间戳是Unix时间(从1970年开始的秒数),直接相减就能得到秒数,脚本里已经帮你转成了更直观的时分秒格式 - 过滤作业:如果你的作业没有统一前缀或数组ID,也可以先导出所有作业的时间信息,再手动筛选目标批次:
然后从qacct -f <你的队列名> | grep -E '(jobname|qsub_time|start_time|end_time)' > job_times.txtjob_times.txt里挑出你需要的作业,再用类似的awk逻辑计算。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

