想看服务器GPU当前有谁在用,最快是SSH登录后执行 nvidia-smi,把最下方 Processes 表里的每个 PID 用 ps -o user= -p PID 转成用户名;没有完整权限时,可以让管理员开一个 gpustat 或 nvitop 只读面板,直接看 USER 列。
服务器GPU当前有谁在用?先用一条命令看个大概
在大多数 Linux 服务器上,NVIDIA 驱动自带 nvidia-smi,登录后直接敲:
nvidia-smi
输出会分上下几块:显卡型号、驱动版本、风扇、温度、功耗、显存和 GPU 利用率。真正回答“有谁在用”的部分,不是顶部的大数字,而是最下方 Processes 表格,这张表会按 GPU 序号列出正在占用显存的进程,包含 PID、类型(C 表示计算,G 表示图形)、进程名和显存占用。
很多运维新手只盯住 GPU 利用率,看到 90% 就以为有人在训练模型,但顶部利用率只是硬件状态,看不到人,真正要查使用者,必须看 PID,以一台 8 卡服务器为例,输出可能长这样:
| 0 N/A N/A 12345 C python3 18500MiB |
| 0 N/A N/A 12367 C python3 10240MiB |
| 3 N/A N/A 12400 C python3 22000MiB |
每个 PID 就是一个进程。PID 对应哪个系统账号,那个账号就是当前占用 GPU 的人,如果同一张卡上出现多个 PID,说明这张卡被多个任务同时分占显存。
用 watch 持续观察谁在上下卡
单次 nvidia-smi 是快照,多人共用时进程会不断变化,建议执行:
watch -n 1 nvidia-smi
每一秒刷新一次,能看到谁刚启动任务、谁释放了显存,按 Ctrl+C 退出,如果只是想观察变化,不要设置太短间隔,0.5 秒刷新一次对 GPU 状态读取影响不大,但人眼也看不过来,还容易漏掉关键变化。
怎么查gpu被谁占用?把PID变成用户名的两条命令
nvidia-smi 有个小坑:它默认不一定显示用户名,多数发行版和驱动版本中,Processes 表只有 PID、类型、进程名和显存,没有 USER 列,这时就需要把 PID 转成系统用户,这就是服务器运维日常常说的“gpu 被谁占用了怎么查”。
ps 单查某个 PID
拿刚才的 12345 举例:
ps -o user= -p 12345
输出会干净地返回一个用户名,wangfei,如果还想在同一行显示完整进程和启动时长,可以执行:
ps -o user,pid,etime,cmd -p 12345
批量把GPU上的PID全部转成用户名
一张卡可能被多个进程同时吃显存,一行一条命令太慢,直接执行:
nvidia-smi --query-compute-apps=pid --format=csv,noheader | xargs -I{} ps -o user= -p {}
如果担心重名,再加个 sort -u 去重:
nvidia-smi --query-compute-apps=pid --format=csv,noheader | xargs -I{} ps -o user= -p {} | sort -u
运行完得到的,就是当前真正占用 GPU 的所有用户名。这是最接近“服务器GPU当前有谁在用”的标准答案。
gpustat 一行直接带用户
如果服务器已经装了 gpustat,会更省事,执行:
gpustat -i 1
输出里天然包含 USER 列,显存、利用率、温度都排好,不需要再做 PID 反查。
下面把常用查看方式做一个简单对比:
| 工具 | 是否直接显示用户名 | 适合场景 |
| nvidia-smi | 部分驱动版本不显示 | 基础查卡、看显存 |
| ps -o user= -p PID | 按 PID 单查 | 确认单个进程归属 |
| gpustat | 是 | 快速监控多人共用 |
| nvitop | 是 | 交互式管理、实时排序 |
linux查gpu占用用户时容易忽略的3个细节
容器进程的“真身”不一定是容器内用户
现在相当一部分训练任务跑在 Docker 里,宿主机上看到的 PID 属于容器进程,执行 ps -o user= -p PID 可能返回 root,但容器内实际是某个普通用户,如果直接判断为 root 在跑任务,很容易找错人,更准确的方式是同时看容器名:
ps -o user,pid,cmd -p PID
再结合 docker ps 找对应容器,行业共识认为,共享GPU服务器必须提前规划容器 UID 映射,否则时间一长连管理员都分不清责任进程。
同一块卡上的显示异常
一台机器多张卡时,有时 GPU 0 显存已快满,但 Processes 表里只剩一个 PID,可能是残留进程、僵尸进程,或是驱动层缓存未释放,优先用:
nvidia-smi --query-compute-apps=pid,used_memory --format=csv
确认存在,再去 /proc/PID/status 看进程状态,状态为 Z 的僵尸进程需要管理员清理,普通用户直接杀不掉。
不要频繁全量轮询
一个运维脚本如果每 0.2 秒调用一次 nvidia-smi --query,会消耗可观的 CPU 和 GPU 管理开销,多数情况下 1 秒刷新足够,对于几十卡的集群,建议使用 Prometheus + DCGM exporter 统一采集,而不是每台机器手动敲命令。
服务器GPU多人使用怎么管理?从“看见谁在用”到“管住谁能用”
只靠 nvidia-smi 看谁在用,是事后追责,如果服务器GPU多人使用怎么管理都靠吼,很快会乱套,更合适的做法是给每张卡建立可见性和使用边界。
用 nvitop 做只读监控
nvitop 类似 htop,但面向 GPU,输入:
nvitop
屏幕上每行是一个 GPU 进程,USER、GPU利用率、显存、运行时长、命令行都在,管理者可以直接看到某位同事在 3 号卡跑 PyTorch 训练,这个工具也适合给非管理员开只读权限,不需要 sudo。
设置 CUDA_VISIBLE_DEVICES 限定卡
在启动任务前设置:
CUDA_VISIBLE_DEVICES=2,3 python train.py
这样该任务只能看到物理 2、3 号卡,用户之间不容易互相干扰。如果不设这个环境变量,程序通常默认只用 0 号卡,这也是为什么很多服务器 0 号卡爆满、其余卡空闲。
用 Slurm 或 Kubernetes 做排队
超过 6 人共用的 GPU 服务器,最好上调度系统,Slurm 提交任务时指定 --gres=gpu:1,系统自动分配空闲卡;Kubernetes 配合 device plugin 也能按显存配额调度,这样“谁在用”不再靠查命令,而是有任务队列可看,业内专家指出,这种调度方式能显著减少同卡争抢。
GPU服务器租用价格和成都机房:对查看占用有什么影响
如果你用的不是自建服务器,而是租用 GPU 云主机或共享 GPU 资源池,情况会稍有不同。GPU服务器租用价格按卡时或包月结算时,很多平台会提供控制台页面直接显示GPU当前有谁在用,不需要你 SSH 登录敲 nvidia-smi,但共享型资源池一般不会给你完整驱动权限,只能看到自己任务的占用。
成都GPU服务器共享环境怎么查占用
以成都GPU服务器为例,部分西南机房会提供 web 监控面板,登录后能看到集群卡型、显存占用和账号任务,如果你通过 SSH 登录宿主机发现 nvidia-smi 被限制,只能返回自己的进程,这可能是平台用 cgroups 或 MIG 做了隔离,此时不要反复提权查看别人的任务,直接看控制台配额和账单更合适。
价格计费下更需要会看占用
按量付费的 GPU 资源,任务跑完如果显存不释放,钱包会一直扣费。
学会在租用机器上执行 nvidia-smi 确认进程退出、显存归零,再关机或释放实例,本身就是一个省钱动作,不同地域的 GPU 租用价格差异较大,西部机房常以托管成本优势参与竞争,但查看占用的命令全国通用,不会因为你在成都或上海而有本质区别。
快速落地:一套检查流程
到一台共享 GPU 服务器上,想快速知道当前谁在用,按下面顺序做:
- 登录后执行
nvidia-smi - 看最下方 Processes 表,记录所有 PID
- 执行
nvidia-smi --query-compute-apps=pid --format=csv,noheader | xargs -I{} ps -o user= -p {} | sort -u - 得到当前占用 GPU 的用户列表
- 如果发现某卡显存占满但 PID 很短,可能是容器或异常进程
- 需要持续观察就执行
watch -n 1 nvidia-smi或gpustat -i 1
服务器 GPU 当前有谁在用,核心不是看利用率,而是看进程 PID 和对应的系统用户。nvidia-smi 提供 PID,ps -o user= -p PID 提供人名,gpustat 和 nvitop 把这两步合成一行,对于多人共用、容器任务和租用资源池,还需要结合容器映射、调度系统和控制台面板,才能准确判断每一张卡的当前主人。
Q&A:服务器GPU当前有谁在用的几个常见问题
服务器GPU当前有谁在用,最简单的一条命令是什么?
登录后在终端执行 nvidia-smi,查看最下方 Processes 表的 PID;然后执行 ps -o user= -p PID 得到用户名,若想一步到位,使用 gpustat -i 1 可直接看到 USER 列。
nvidia-smi不显示用户名怎么办?
默认很多驱动版本的 nvidia-smi 进程表不显示 USER 列,可以执行 nvidia-smi --query-compute-apps=pid --format=csv,noheader | xargs -I{} ps -o user= -p {},用 PID 反查用户名,容器任务可能会出现 root,需要结合 docker ps 和容器 UID 映射判断。
多人共用GPU服务器怎么防止别人占满显存?
不要直接依赖口头协商,启动任务前设置 CUDA_VISIBLE_DEVICES 限定物理卡,CUDA_VISIBLE_DEVICES=0 python train.py;对超过 6 人的团队,使用 Slurm 或 Kubernetes 做 GPU 排队和配额;日常用 nvitop 查看空闲卡和占用用户,避免同时抢一张卡。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/642701.html





