使用 nvidia-smi 获取最高内存消耗进程的 PID
Get PID of highest memory consuming process with nvidia-smi
目前我有一个小 bash 脚本总结了
所有进程的 vram 使用情况。
nvidia-smi | awk '{print }'| awk '{ SUM += } END { print SUM }'
但现在我想获取使用最多 VRAM 的进程的 PID。
之后我想用
获取 PID 的用户
ps -u -p $pid
编辑目前我的 nvidia-smi 看起来像这样:
我想获取 PID 29187,因为此 PID 使用最多 vram(3649MB)
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 208... On | 00000000:01:00.0 On | N/A |
| 35% 43C P8 36W / 250W | 5012MiB / 11016MiB | 15% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 5512 G /usr/lib/xorg/Xorg 257MiB |
| 0 5786 G kwin_x11 77MiB |
| 0 5790 G /usr/bin/krunner 6MiB |
| 0 5800 G /usr/bin/plasmashell 114MiB |
| 0 26439 G /usr/lib/xorg/Xorg 73MiB |
| 0 26457 G /usr/bin/sddm-greeter 132MiB |
| 0 29154 C+G .../Binaries/Linux/CarlaUE4-Linux-Shipping 619MiB |
| 0 29187 C python 3649MiB |
| 0 29999 G /opt/ros/melodic/lib/rviz/rviz 62MiB |
+-----------------------------------------------------------------------------+
或者作为图像:https://i.stack.imgur.com/ypVza.png
它运行的最终脚本。
sum=$(nvidia-smi | awk 'NR>14{SUM+=} NR>14 &&
0+>MAX{MAX=0+;MAXSTRING=;MAXPID=} END{printf SUM;}')
maxpid=$(nvidia-smi | awk 'NR>14{SUM+=} NR>14 &&
0+>MAX{MAX=0+;MAXSTRING=;MAXPID=} END{printf MAXPID;}')
if [ $sum -lt 8000 ]
then
hostname | tr -d '\n'
echo ' 'AVAILABLE vram $sum
else
hostname | tr -d '\n'
user=$(ps -u -p $maxpid| awk '{print}'| awk 'FNR == 2 {print}')
echo ' 'false, $user is responsible
fi
您可以合并两个 awk
语句,并修复将 Driver Version:
中的数字添加到总数中的问题,如下所示:
nvidia-smi | awk 'NR>14{SUM+=}END{print SUM}'
只有大于第 14 行(您关心的数据所在的行。
添加一些逻辑来获取最大值并打印出过程:
nvidia-smi | awk 'NR>14{SUM+=} NR>14 && 0+>MAX{MAX=0+;MAXSTRING=;MAXPID=} END{print SUM,MAXPID,MAXSTRING}'
这将打印出总和、具有最大 GPU 内存使用量的 PID 和那个内存使用量。
如果 GPU Memory Usage
可以切换单位(比如在 MiB
和 KiB
之间),这就会崩溃。
为了更有效地解析涉及所有 SI 度量单位 KiB
和 GiB
,您可以执行以下操作。这需要 GNU awk
来实现数组排序功能
awk '
~ /[M|K|G]iB/ {
if ( index( , "KiB" ) ) { gsub(/[^0-9]/, "", ); ram = (+0) * 1024 }
if ( index( , "MiB" ) ) { gsub(/[^0-9]/, "", ); ram = (+0) * 1024 * 1024 }
if ( index( , "GiB" ) ) { gsub(/[^0-9]/, "", ); ram = (+0) * 1024 * 1024 * 1024 }
usage += ram
map[] = ram
}
END {
PROCINFO["sorted_in"]="@val_num_desc"
printf "Total RAM Usage = %s\n",((usage/1024)/1024)"MiB"
for (i in map) {
printf "Highest RAM Usage PID = %d Value = %s\n", i, ((map[i]/1024)/1024)"MiB"
break
}
}'
目前我有一个小 bash 脚本总结了 所有进程的 vram 使用情况。
nvidia-smi | awk '{print }'| awk '{ SUM += } END { print SUM }'
但现在我想获取使用最多 VRAM 的进程的 PID。 之后我想用
获取 PID 的用户ps -u -p $pid
编辑目前我的 nvidia-smi 看起来像这样: 我想获取 PID 29187,因为此 PID 使用最多 vram(3649MB)
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 208... On | 00000000:01:00.0 On | N/A |
| 35% 43C P8 36W / 250W | 5012MiB / 11016MiB | 15% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 5512 G /usr/lib/xorg/Xorg 257MiB |
| 0 5786 G kwin_x11 77MiB |
| 0 5790 G /usr/bin/krunner 6MiB |
| 0 5800 G /usr/bin/plasmashell 114MiB |
| 0 26439 G /usr/lib/xorg/Xorg 73MiB |
| 0 26457 G /usr/bin/sddm-greeter 132MiB |
| 0 29154 C+G .../Binaries/Linux/CarlaUE4-Linux-Shipping 619MiB |
| 0 29187 C python 3649MiB |
| 0 29999 G /opt/ros/melodic/lib/rviz/rviz 62MiB |
+-----------------------------------------------------------------------------+
或者作为图像:https://i.stack.imgur.com/ypVza.png
它运行的最终脚本。
sum=$(nvidia-smi | awk 'NR>14{SUM+=} NR>14 &&
0+>MAX{MAX=0+;MAXSTRING=;MAXPID=} END{printf SUM;}')
maxpid=$(nvidia-smi | awk 'NR>14{SUM+=} NR>14 &&
0+>MAX{MAX=0+;MAXSTRING=;MAXPID=} END{printf MAXPID;}')
if [ $sum -lt 8000 ]
then
hostname | tr -d '\n'
echo ' 'AVAILABLE vram $sum
else
hostname | tr -d '\n'
user=$(ps -u -p $maxpid| awk '{print}'| awk 'FNR == 2 {print}')
echo ' 'false, $user is responsible
fi
您可以合并两个 awk
语句,并修复将 Driver Version:
中的数字添加到总数中的问题,如下所示:
nvidia-smi | awk 'NR>14{SUM+=}END{print SUM}'
只有大于第 14 行(您关心的数据所在的行。
添加一些逻辑来获取最大值并打印出过程:
nvidia-smi | awk 'NR>14{SUM+=} NR>14 && 0+>MAX{MAX=0+;MAXSTRING=;MAXPID=} END{print SUM,MAXPID,MAXSTRING}'
这将打印出总和、具有最大 GPU 内存使用量的 PID 和那个内存使用量。
如果 GPU Memory Usage
可以切换单位(比如在 MiB
和 KiB
之间),这就会崩溃。
为了更有效地解析涉及所有 SI 度量单位 KiB
和 GiB
,您可以执行以下操作。这需要 GNU awk
来实现数组排序功能
awk '
~ /[M|K|G]iB/ {
if ( index( , "KiB" ) ) { gsub(/[^0-9]/, "", ); ram = (+0) * 1024 }
if ( index( , "MiB" ) ) { gsub(/[^0-9]/, "", ); ram = (+0) * 1024 * 1024 }
if ( index( , "GiB" ) ) { gsub(/[^0-9]/, "", ); ram = (+0) * 1024 * 1024 * 1024 }
usage += ram
map[] = ram
}
END {
PROCINFO["sorted_in"]="@val_num_desc"
printf "Total RAM Usage = %s\n",((usage/1024)/1024)"MiB"
for (i in map) {
printf "Highest RAM Usage PID = %d Value = %s\n", i, ((map[i]/1024)/1024)"MiB"
break
}
}'