美文网首页生信log
生信log37|如何在HPC计算节点上获取进程资源消耗的信息及合

生信log37|如何在HPC计算节点上获取进程资源消耗的信息及合

作者: 小周的万用胶囊 | 来源:发表于2023-06-20 14:05 被阅读0次

有使用超算或者服务器的同学应该会接触过超算投递系统,在提交生信任务时,我们需要设置好资源,比如说cpu用多少,内存给多少。学生时代的我是有多大内存提供就设多大内存,有多少CPU数提供就设多少CPU,经过一段时间使用超算的体验发现,资源还是要合理分配才能达到最大的效率,也避免任务因为申请超额的资源而被管理员kill掉或者出现节点宕机的情况(最重要,省钱!)。

0、前言

为什么要这么做?

  • 合理分配资源,避免作业因资源问题而造成拥堵
  • 提高软件的效率
  • 省钱

思路

  • 实现top命令的功能并记录下来
    top命令的实现实际上也是不断地到系统中的/proc/$PID//proc/目录下不断地获取与进程相关的信息并可视化相关的参数。
  • qacct命令获取调度器中任务id(job)的信息

1、Nextflow资源监控模式

  • 生信流程引擎Nextflow提供了监控流程中的进程资源消耗的功能,通过下面的命令打卡监控模式;
  • 流程运行的过程中不可能每时每刻都使用top命令查看流程中的每个进程;
  • 一个流程包含多个进程,难以统计;
  • HPC超算计算的服务投递之后仅返回任务的jobID,用户并不能直接获取流程中进程的ID号(相当于没办法直接获得流程中进程的PID号);
nextflow run <pipeline name> -with-trace

2、结果解读及脚本计算公式

  • nextflow资源获取结果:结果总共输出15项结果(见下图)


    nextflow统计结果
  • 与投递资源相关的参数:%CPU和vmem(图上除了百分比的数值以外其他数据的单位均为kb)

%cpu:进程占用 CPU 百分比

  • 进程的时间到/proc/pid/stat 这个文件中获取时间的结果:第14列:Utime(进程在用户态运行的时间),第15列:Stime(进程在内核态运行的时间),第16列:Cutime(进程等待的子进程在用户态运行的时间),第17列:Cstime(进程等待的子进程在内核态运行的时间)

计算公式:

CPU(\%) = \frac{进程等待时间*100}{总CPU时间}=\frac{ 100 * (after \_proc\_cpu\_total – prev\_proc\_cpu\_total) }{after\_cpu\_total – prev\_cpu\_total}

prev_proc_cpu_total = utime + stime + cutime + cstime
after_proc_cpu_total = utime + stime + cutime + cstime
下面的脚本中,如果是多核心系统还需要乘以cpu核心数

process_total_time=$(2> /dev/null < /proc/$pid/stat awk '{printf "%.0f", ($14+$15+$16+$17)*10 * cpu_num }' || echo -n 'X')
  • 总CPU时间的获取到/proc/stat获取第2列到第9列
    prev_cpu_total = user + nice + system + idle + iowait + irq + softirq
    after_cpu_total = user + nice + system + idle + iowait + irq + softirq
    对应代码如下:
cpu_total=$(grep '^cpu ' /proc/stat |awk '{sum=$2+$3+$4+$5+$6+$7+$8+$9+$10; print sum}')

vmem:进程使用的虚拟内存大小,这个值可以直接获取,只需进行字节的转化
vf(virtual\_free)= \frac{vmem}{1024 * 1024}

3、验证方法及SGE查看计算节点资源消耗的方法

  • 利用ssh和top获取计算节点上的进程信息与返回的结果进行比较(此处没截到数据),但返回的%CPU,%MEM,VMEM基本与TOP返回的结果一致。
ssh -t remotehost top -u userid #即用户名
获取计算节点上的进程信息
  • 有多核系统的top命令数据
    如果是多核系统top命令中的%CPU会返回大于100% 的数值,说明这个任务被分配了多个CPU或者多个线程
image.png
  • 在SGE管理集群上使用qacct命令获取job任务跑任务时使用的最大虚拟内存(maxvmem)
# 列出全部的job
qacct -o user -d 1 -j
# 指定job
qacct -o user -d 1 -j job_id
利用qacct查看job的使用的虚拟内存

4、结果解析及资源分配确定

最后回答开头的问题即“到底要给一个脚本任务分配多少资源”

在qsub系统中如何设置vf(virtual_free)大小,还有smp的数量

  • 换算公式

smp数量设置

smp\_num = \frac{\%CPU}{100} (个)

vf虚拟内存大小设置
vf(virtual\_free)= \frac{vmem}{1024 * 1024} (GB)


参考
SGE virtual free设置教程
top
cpu-usage-calculation
中文版解说
参考3
stackoverflow cpu%解释

推荐阅读
生信Log32|NEXTFLOW资源统计bash脚本知识统计一览

相关文章

  • 用singularity来管理软件

    背景 生物信息中的分析流程往往需要消耗很大的内存,读写以TB计算的数据,属于典型的高性能计算(HPC)应用。生信分...

  • 进程管理

    进程管理进程和线程图形简单解释进程和线程管理VIM编辑Linux 系统资源信息的获取获取 Linux CPU 信息...

  • 002-进程信息

    获取进程信息 (1)获取本地计算机的所有进程:Process[] myProcesses = Process.Ge...

  • SJM HPC-SGE 投递任务管理工具简介

    HPC-SGE环境下的任务投递方式   HPC指的是高可用计算集群,是相对于单机服务或节点而言的,通过节点或集群间...

  • 8-提权

    1.获取IP地址信息2.获取端口信息3.获取服务信息和进程信息4.进程结束,用户管理命令 3.获取服务信息和进程信...

  • 【bioHPC-1】用Vagrant创建虚拟集群

    高性能计算(High Performance Computing,HPC)集群, 简称集群,是将多个计算机节点用高...

  • Openstack计算节点停服移除

    停掉计算节点的服务 在控制节点上查看信息 调试计算节点不可用 查看计算节点状态 从数据库中删除计算节点信息 再次查...

  • k8s in action

    每个虚拟机需要运行自己的一 组系统进程, 这就产生了除组件进程消耗 以外的额外计算资源损耗。

  • 比特币中怎么挖矿?|乌托市场

    挖矿是“为获取比特币而付出努力”这个过程的比喻,它通过消耗计算资源来处理交易,确保网络安全,保持网络中每个人的信息...

  • 比特币中挖矿是什么?|乌托市场

    挖矿是“为获取比特币而付出努力”这个过程的比喻,它通过消耗计算资源来处理交易,确保网络安全,保持网络中每个人的信息...

网友评论

    本文标题:生信log37|如何在HPC计算节点上获取进程资源消耗的信息及合

    本文链接:https://www.haomeiwen.com/subject/wgrcydtx.html