如何监控GPU使用情况并杀死指定其中进程
仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/
有时候我们常常会有一个需求是监控GPU指定情况,并且需要根据需要杀死GPU进程
这里介绍几个与之相关的指令:
watch -n 秒数 命令 :每隔指定秒数,就执行一次命令,并将结果打印在屏幕上
例如:
watch -3 nvidia-smi
watch -n 3 nvidia-smi
上述命令每隔三秒就输出一次GPU列表信息
通过 nvidia-smi 可以输出使用GPU的进程ID,因此可以借助 awk 工具对 nvidia-smi 的输出进行过滤,从而找到进程信息,再对指定进程进行kill
例如:
要终止GPU-0到GPU-3的所有进程中,PID大于1000的,可以使用如下指令完成:
kill -9 $(nvidia-smi | awk '$2 == "GPU" && $3 == "PID" {flag = 1} flag && $3 > 0 {print $2, $3}' | awk '$1 < 4 && $2 > 1000 {print $2}')
kill -9 PIDs 需要所有待停止的进程编号,而 nvidia-smi 经过第一个 awk 的输出为:
GPU PID
0 10053
1 3343
再经过第二个awk后,即可对GPU ID 和PID进行筛选,并输出 {print $2},可以得到:
10053
3343
最后,通过 $() 对输出的 PID 进行读取,完成kill过程。
同样的,结合 watch 指令,我们可以周期性地清理占用GPU的僵尸进程
例如,每分钟清理一次:
sudo watch -n 60 kill -9 $(nvidia-smi | awk '$2 == "GPU" && $3 == "PID" {flag = 1} flag && $3 > 0 {print $2, $3}' | awk '$1 < 4 && $2 > 1000 {print $2}')
或者防止非法用户访问GPU:
sudo watch -n 60 kill -9 $(for x in $(nvidia-smi | awk '$2 == "GPU" && $3 == "PID" {flag = 1} flag && $3 > 0 {print $2, $3}' | awk '$1 < 4 && $2 > 1000 {print $2}'); do ps -aux | awk '$2 == '$x' && $1 == "illigal_user_name" {print $2}'; done)
原始问题和我的回答见:这里,网址:https://unix.stackexchange.com/questions/250244/how-to-kill-all-processes-using-a-given-gpu/511668#511668