如何使用fuser清理占用显存的进程?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
rememberzrr 2025-06-26 18:25关注一、理解 GPU 显存占用与进程管理
在 Linux 系统中,尤其是在深度学习或高性能计算环境中,GPU 显存的使用往往由多个进程共同管理。当某个训练任务异常终止后,可能会导致显存未能正确释放,从而阻碍后续任务的执行。
此时,需要通过系统工具识别并清理占用 GPU 资源的进程。常用的工具之一是
fuser,它可以查看哪些用户和进程正在访问特定的文件或设备节点,包括 NVIDIA 的 GPU 设备文件(如/dev/nvidia0)。1.1 GPU 设备文件路径说明
NVIDIA 驱动安装完成后,会在
/dev/目录下生成若干设备文件,常见的如下:/dev/nvidia0/dev/nvidia1/dev/nvidiactl/dev/nvidia-uvm
这些设备节点代表不同的 GPU 卡和控制接口。若要查看所有 GPU 的使用情况,可以使用通配符
/dev/nvidia*。二、使用 fuser 查找占用 GPU 的进程
首先,我们需要使用
fuser命令来查看当前有哪些进程正在访问 GPU 设备。2.1 使用命令查看占用信息
sudo fuser -v /dev/nvidia*该命令会输出类似以下的信息:
User PID Access Command user1 12345 F.... python user2 67890 F.... train_model.py 其中,
PID是进程标识符,后续将用于终止进程。2.2 分析输出内容
每一行代表一个访问 GPU 的进程。例如,PID 为 12345 的进程是由 user1 启动的 python 进程,可能是一个训练脚本。
你可以结合
ps -ef | grep PID来进一步确认进程的完整信息,防止误杀重要服务。三、强制终止占用进程以释放显存
找到目标 PID 后,即可使用
kill命令进行终止。3.1 终止指定进程
sudo kill -9 12345参数
-9表示强制终止进程,适用于无法正常退出的僵尸进程。3.2 注意事项
- 操作前请确认目标进程是否属于其他用户的任务或关键服务。
- 避免频繁使用
kill -9,应优先尝试kill或kill -15让进程优雅退出。 - 如果多个 GPU 都被占用,可逐个处理或编写脚本批量清理。
四、自动化清理脚本示例
为了提高效率,可以编写一个简单的 Bash 脚本来自动查找并终止所有占用 GPU 的进程。
#!/bin/bash for dev in /dev/nvidia*; do sudo fuser -v $dev | awk '{print $2}' | xargs -r sudo kill -9 done该脚本遍历所有 GPU 设备节点,并对每个设备上查到的进程进行强制终止。
五、深入分析:fuser 的工作原理
fuser命令的核心机制是读取内核中的进程文件描述符信息,查找是否有进程打开了指定的文件或设备。它依赖于/proc文件系统的结构。对于 GPU 设备来说,当一个进程调用 CUDA API 时,通常会打开
/dev/nvidia0等设备节点,因此fuser可以检测到这类访问行为。六、替代方案与其他工具对比
除了
fuser,还可以使用以下工具进行排查:nvidia-smi:显示 GPU 使用状态及对应的 PID。lsof /dev/nvidia*:列出所有打开 GPU 设备的进程。ps aux | grep python:辅助查找可疑的 Python 进程。
虽然
nvidia-smi更直观,但有时因驱动问题无法实时更新,而fuser更加底层可靠。七、流程图展示整个操作逻辑
graph TD A[开始] --> B{检查GPU占用} B --> C[fuser -v /dev/nvidia*] C --> D[获取PID列表] D --> E[确认PID对应进程] E --> F{是否安全终止?} F -- 是 --> G[kill -9 PID] F -- 否 --> H[跳过或手动处理] G --> I[完成清理] H --> I本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报