如何查询占用指定GPU的Docker镜像(含闲置内存占用场景)
解决Docker容器GPU内存占用定位问题
首先明确:静态的Docker镜像不会占用GPU资源,实际占用GPU的是运行中的容器(或容器退出后残留的进程)。以下是几种定位GPU占用关联容器的方法:
1. 基础GPU占用与PID关联
先通过nvidia-smi查看GPU的占用情况,获取占用GPU的进程PID:
nvidia-smi
输出中会列出每个占用GPU的进程PID、GPU编号等核心信息。
2. 将PID映射到Docker容器
拿到PID后,用以下命令找到该PID所属的容器:
- 方法一:遍历所有容器匹配PID
docker inspect --format '{{.Name}} (PID: {{.State.Pid}})' $(docker ps -q) | grep <目标PID>
- 方法二:直接过滤容器PID
docker ps --filter "pid=<目标PID>" --format "table {{.Names}}\t{{.Image}}\t{{.Pid}}"
如果容器已停止但仍有残留进程,可加上-a参数查看所有容器:
docker ps -a --filter "pid=<目标PID>" --format "table {{.Names}}\t{{.Image}}\t{{.Pid}}"
3. 直接查看容器的GPU使用情况
使用Docker的GPU统计功能(需Docker支持GPU管理),查看所有容器的GPU占用:
docker stats --format "table {{.Name}}\t{{.Image}}\t{{.GPUUsage}}\t{{.GPUMemUsage}}" --no-stream
该命令会直接展示每个容器的GPU使用率、内存占用,以及对应的镜像名称。
4. 确认特定镜像x是否占用GPU2
方法一:先找镜像x的所有容器,再检查GPU使用
- 列出所有基于镜像x的容器ID:
docker ps -q --filter "ancestor=x"
- 对每个容器ID,检查其绑定的GPU设备:
docker inspect <容器ID> --format '{{.Name}}: {{.HostConfig.DeviceRequests}}'
或者直接查看容器内的GPU使用:
docker exec <容器ID> nvidia-smi
方法二:从GPU2的进程反向关联镜像
- 获取GPU2的所有占用PID:
nvidia-smi --query-compute-apps=pid,gpu_uuid --format=csv | grep <GPU2的UUID或编号>
- 对每个PID,用前面的方法找到所属容器,再检查容器的镜像是否为x:
docker inspect <容器ID> --format '{{.Name}}: {{.Config.Image}}'
5. 清理残留GPU占用
如果容器已停止但GPU内存仍被占用,大概率是残留的僵尸进程,直接杀掉对应PID即可:
kill -9 <目标PID>
若问题仍存在,可重启Docker服务彻底清理:
systemctl restart docker
内容的提问来源于stack exchange,提问作者james_kumal
相关产品推荐
相关产品推荐

