【ubuntu】查看服务器上的进程占用GPU情况

【ubuntu】查看服务器上的进程占用GPU情况

参考《shell脚本显示GPU进程所属docker 容器》
该博客是读取nvidia-smi信息后处理为奇数行为进程ID,偶数行为显存占用,作者改为多读取了GPU编号(判断该行的信息是否为一位整数,前提是进程ID不可能为一位整数)

#!/bin/bash
# find docker container by process id
processId=
# 提取程序的名字
PROGNAME=$(basename $0)
usage () {
    echo " $PROGNAME [-p --processId] or $PROGNAME"
    return
}
# 一个while case用来提取参数
while [[ -n $1 ]]; do
    case $1 in  
    -p | --processId) shift
                      processId=$1
                      ;;  
    -h | --help) usage
                 exit
                 ;;  
    *) usage >&2 
       exit 1
       ;;  
    esac
    shift
done

# 定义一个函数
findCon () {
    # $1 是函数的输入
    local pId=$1
    # awk '{print $1,$NF}' 打印第一列和最后一列,即容器ID和容器Name,awk 'NR != 1' 不打印第一行
    # read代表读入变量
    docker ps | awk '{print $1,$NF}' | awk 'NR != 1' | while read conId conName; do
                # 对pId的grep使用正则表达式,不然的话如果输入进程pId为21则会匹配到21274,通过前后加入空格匹配就可以防止出现这种问题
                local temp="[[:space:]]\{1\}${pId}[[:space:]]\{1\}"
                if [[ -n $(docker top $conId | grep -e $temp) ]]; then
                   printf "%s\t\t%s\t\t%s\t\t\n" $pId $conId $conName
                    break
                fi
            done
    return
}

# 定义一个函数
findConWithGPU () {
    # $1 是函数的输入
    local pId=$1
    local gpuId=$2
    # awk '{print $1,$NF}' 打印第一列和最后一列,即容器ID和容器Name,awk 'NR != 1' 不打印第一行
    # read代表读入变量
    docker ps | awk '{print $1,$NF}' | awk 'NR != 1' | while read conId conName; do
                # 对pId的grep使用正则表达式,不然的话如果输入进程pId为21则会匹配到21274,通过前后加入空格匹配就可以防止出现这种问题
                local temp="[[:space:]]\{1\}${pId}[[:space:]]\{1\}"
                if [[ -n $(docker top $conId | grep -e $temp) ]]; then
                   printf "%s\t%s\t\t%s\t\t%s\t\t" $gpuId $pId $conId $conName
                    break
                fi
            done
    return
}


# 如果 $processId不为空
if [[ -n $processId  ]]; then
    # 判断输入是否为数字
    if [[ $processId =~ ^[0-9]+$ ]]; then
        # printf "conId%s\t\t\tconName%s\n" $conId $conName
        printf "PID\t\tconId\t\t\tconName\n"
	findCon $processId
    else
        echo "Please input number"
        exit 1
    fi
else
    num=0
    gpunum=0
   printf "GPU\tPID\t\tconId%s\t\t\tconName%s\t\t\tGPU Memory\n" $conId $conName
    # 这一串awk操作为提取进程id和GPU使用情况,然后去掉空格,-F为设定awk分隔符,在命令行输出一边就看懂了
    nvidia-smi -q 2>&1| awk '/Process ID|Used GPU Memory|Minor Number/' | awk '{gsub(/[[:blank:]]*/,"",$0);print $0}' | awk -F ":" '{print $NF}' | while read item; do
    if [[ $item =~ ^[0-9]$ ]]; then
        # printf "gpunum\n"
        gpunum=$(($item))
    else
        num=$((num+1))
        if [[ $(($num % 2)) != 0 ]]; then
            findConWithGPU $item $gpunum
        else
            printf "%s\n" $item
        fi
    fi
    done
fi

### 查看 GPU 占用率的方法 #### 在 Linux 系统上查看 GPU 占用率 对于配备了 NVIDIA 显卡的 Linux 系统,`nvidia-smi` 是一个非常实用的命令行工具,它能提供关于 GPU 使用情况、温度以及内存占用等多方面的信息[^1]。 ```bash nvidia-smi ``` 除了 `nvidia-smi` 外,还有更高级别的工具如 `nvitop` 可以用来监控 GPU 的使用状况。这类工具不仅提供了更为直观的界面,还增加了额外的功能来帮助用户更好地理解 GPU 资源是如何被分配使用的[^2]。 另外,在 Linux 中还可以利用 `top` 或者 `htop` 这样的通用进程监视器来观察特定进程对 CPU RAM 的消耗情况;虽然这些工具主要用于跟踪 CPU 性能指标,但对于某些应用程序来说也可能间接反映出它们对 GPU 的影响程度[^3]。 #### 在 Windows 系统上查看 GPU 占用率 针对 Windows 用户而言,同样可以通过运行 `nvidia-smi` 来获取详细的 GPU 统计数据。只需打开 PowerShell 或 Command Prompt 并输入该指令即可获得即时报告。值得注意的是,这个方法适用于已经安装了相应驱动程序支持软件包的情况下的 NVIDIA 设备。 此外,Windows 自带的任务管理器也能够很好地完成这项工作——通过图形化界面展示当前活动进程中每一个实例所对应的 GPU 利用量百分比以及其他相关信息。 #### 实现远程监控解决方案 考虑到实际应用场景中的复杂性灵活性需求,有时候可能需要从另一台计算机甚至跨越网络边界去访问目标机器上的 GPU 数据。为此开发了一些专门的小型应用或者脚本,允许管理员轻松实现这一点而不必亲自登录到物理位置所在的服务器上去操作。例如提到的一个案例就是借助第三方编写的 Python 脚本来定期抓取并汇报远端 Ubuntu 虚拟环境内部署有 AI 模型训练平台时产生的负载变化趋势[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值