显示GPU进程所属docker 容器

这篇具有很好参考价值的文章主要介绍了显示GPU进程所属docker 容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述:

  • 问题1:一台服务器,每个人在上面 run 一个容器,跑各自的代码,虽然通过 nvidia-smi 可以看到每个进程占用的 GPU,但是不好找进程对应的容器 id,就没法确认到底是谁占用了较多GPU。
  • 问题2:当我们在自己的 docker 容器中使用GPU进行模型训练时,训练完毕后,发现GPU 仍然被占用着,这些占用GPU 的进程就是 僵尸进程,只有 kill 掉 这些进程,显卡资源才得到释放。

查看当前占用GPU资源的进程属于哪个Docker容器

通过 nvidia-smi 查看进程占用GPU情况,但是不好找进程对应的容器id:

  • 容器内部,使用 nvidia-smi 命令无法看到 GPU 资源详情
  • nvidia-smi 只能在容器外部用户下,进行查看:
    显示GPU进程所属docker 容器,docker,服务器

通过 docker ps 查看所有运行的容器:

显示GPU进程所属docker 容器,docker,服务器

然后一个一个运行docker top containerId | grep PID,根据返回情况判断这个进程在哪个容器里面 ( 注 :containerId 可以是 CONTAINER ID 前四位)。

比如 docker top c34c | grep 21096 ,返回为空,说明不在这个容器里面,接着再试直到找到容器为止。
显示GPU进程所属docker 容器,docker,服务器
这么做实在是太麻烦了,可以把上面这个过程写成shell脚本,就看了一个 shell教程 就可以写出来。

shell脚本

#!/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" $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
        findCon $processId
    else
        echo "Please input number"
        exit 1
    fi
else
    num=1
   printf "PID\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/' | awk '{gsub(/[[:blank:]]*/,"",$0);print $0}' | awk -F ":" '{print $NF}' | while read item; do
    if [[ $(($num % 2)) != 0 ]]; then
        findCon $item
    else
        printf "%s\n" $item
    fi
    num=$((num+1))
    done
fi

杀死 docker 中的僵尸进程

我们在自己的 docker 容器中使用GPU进行模型训练时,训练完毕后,发现GPU 仍然被占用着:

显示GPU进程所属docker 容器,docker,服务器

1、 先根据 进程的ID 查询其所属容器

显示GPU进程所属docker 容器,docker,服务器
2、使用 jobs -l 或者 ps -ef 查看改容器内的进程 ID,定位僵尸进程

# 在docker 容器外使用一下命令
docker exec 容器名/容器ID ps -ef

# docker 容器内
ps -ef

显示GPU进程所属docker 容器,docker,服务器

3、 杀死 父进程

显示GPU进程所属docker 容器,docker,服务器

kill -9 父进程的PID

显示GPU进程所属docker 容器,docker,服务器
4、再查看GPU占用情况

显示GPU进程所属docker 容器,docker,服务器

  • 此时已经没有僵尸进程占用GPU!!!

注:仅供学习参考,如有不足,欢迎指正!文章来源地址https://www.toymoban.com/news/detail-686714.html

到了这里,关于显示GPU进程所属docker 容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【超详细简单】云服务器中的docker容器挂载云硬盘

    【超详细简单】云服务器中的docker容器挂载云硬盘

    本教程一共分为三步,三步即成! 1. 确认需要挂载到的目录(本文需要挂到docker运行目录) 首先找到云服务器中的docker环境所在的位置(这里的位置指的是docker镜像和容器所在的位置),我这里用的是CentOs,对应的位置是 /var/lib/docker ,如图所示有 containers 和 image 目录出现

    2023年04月24日
    浏览(27)
  • docker容器打包成镜像,在新的服务器上部署环境

    docker容器打包成镜像,在新的服务器上部署环境

    2719a6b5b8e1是容器id(用docker ps 命令查看) , my_paddle2.2.2:v1 是自己打包的镜像的名字命名格式,有冒号的 docker commit -a “shi” -m “to150” 2799a6b6b8e1 my_paddle2.2.2:v1 -o 和 是一个意思都是打包镜像的符号 sparkdemo:v1 ,就是有冒号,整体镜像名字规则 docker images查看镜像,后用命令保存

    2023年04月08日
    浏览(16)
  • 在docker中安装Elasticsearch容器,并且阿里云服务器配置

    在docker中安装Elasticsearch容器,并且阿里云服务器配置

    1、拉取Elasticsearch镜像 2、启动Elasticsearch容器  访问:IP访问地址:9200    

    2024年02月13日
    浏览(15)
  • VsCode容器开发 - VsCode连接远程服务器上的docker

    VsCode容器开发 - VsCode连接远程服务器上的docker

    之前在服务器上的Docker内开发,文件编辑起来就很不爽。不如 使用VsCode直接打开远程服务器上的Docker ,这样就能在VsCode里直接无缝编辑Docker里的文件了。 但是百度和必应得到的中文结果都很奇葩,都是什么“给docker添加端口映射”、“给服务器开放被映射的端口”、“远程

    2024年01月23日
    浏览(30)
  • Docker (CentOS)配置rabbitMQ 服务器访问15672端口显示服务器拒绝连接

    Docker (CentOS)配置rabbitMQ 服务器访问15672端口显示服务器拒绝连接

    在自己的服务器上配置rabbitMq时已经启动成功了,但是访问就是出错。 使用以下命令启动。  启动后可以看到已经启动成功。 输入地址去访问看到被拒绝访问了  那么有三种可能性:1、你的防火墙端口没有开放 使用命令开放端口  2、你的服务器安全组没有添加该端口,去你

    2024年02月14日
    浏览(15)
  • vscode远程访问内网服务器中docker容器小白教程

    vscode远程访问内网服务器中docker容器小白教程

    前言: 我的本意是想用vscode调试学术版gpt的翻译功能,给它加一个自适应的系统提示词。 然而为了这个调试,我付出了太多,怎么这么多弯路要走~ 首先,Windows直接用docker+wsl2调试实在是太痛苦,之前wsl2已经崩溃两次,所以我不得不把程序放在Ubuntu的台式机上。 然而我自己

    2024年04月28日
    浏览(10)
  • 尝试添加服务器中正在运行的docker容器时报错:当前用户没有运行“docker”的权限

    尝试添加服务器中正在运行的docker容器时报错:当前用户没有运行“docker”的权限

    环境 1,通过vscode ssh到服务器的 2,服务器端有一个contianer,但是无法通过vscode的Dev contianer组件将服务器中正在运行的contianer添加过来 3,值得注意的一点是,我没有把当前用户添加到docker用户组中,这也是报错的原因 报错内容 解决办法 当前用户添加到docker用户组中 然后一

    2024年01月19日
    浏览(17)
  • 华为云云耀云服务器L实例评测 | Docker 部署 Reids容器

    华为云云耀云服务器L实例评测 | Docker 部署 Reids容器

    Docker的好处在于: 在不同实例上运行相同的容器 Docker的五大优点: 持续部署与测试 、 多云服务平台支持 、 环境标准化和版本控制 、 隔离 、 安全 Docker 适用于较为小的应用,并发量不大的情况下、微服务为超过10个 ,建议适用Docker部署,这样 也省资源、可减少开发成本

    2024年02月08日
    浏览(15)
  • Docker系列---【mysql容器手动停止后,重启服务器,mysql容器被删掉了,如何恢复mysql数据?】...

    Docker系列---【mysql容器手动停止后,重启服务器,mysql容器被删掉了,如何恢复mysql数据?】...

    为了快速搭建数据库,我使用了docker搭建数据库,由于服务器资源紧张,我想先把mysql容器停掉,启动jenkins容器,使用完之后再停掉jenkins,启动mysql,结果由于服务器资源有限,服务器卡死了,无法远程连接了,没办法,我只能登录运营商的云平台管理平台,强制重启服务器

    2024年02月08日
    浏览(11)
  • 两台服务器上的两个docker容器之间配置ssh免密登录

    两台服务器上的两个docker容器之间配置ssh免密登录

    因为要在两台服务器的容器上使用ucx实现GPU的RDMA,所以需要两个容器之间ssh免密登录 步骤如下(所有步骤均在容器内部进行) 切换成root用户 在容器内部安装openssh: # apt-get install openssh-client openssh-server 编辑ssh的配置文件,更改ssh的端口: # vim /etc/ssh/sshd_config 在最后一行加

    2024年03月13日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包