Получите PID с самым высоким потреблением памяти с помощью nvidia-smi - PullRequest
1 голос
/ 21 февраля 2020

В настоящее время у меня есть небольшой bash скрипт, который подводит итог использования vram всех процессов.

nvidia-smi | awk '{print $6}'| awk '{ SUM += $1} END { print SUM }'

Но теперь я хочу получить PID процесса, который использует больше всего VRAM. После этого я хотел бы получить пользователя PID с

ps -u -p $pid

EDIT, в настоящее время мой 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+=$6} NR>14 && 
0+$6>MAX{MAX=0+$6;MAXSTRING=$6;MAXPID=$3} END{printf SUM;}')

maxpid=$(nvidia-smi | awk 'NR>14{SUM+=$6} NR>14 && 
0+$6>MAX{MAX=0+$6;MAXSTRING=$6;MAXPID=$3} 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$1}'| awk 'FNR == 2 {print}')
    echo ' 'false, $user is responsible
fi

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Вы можете объединить два оператора awk, а также решить проблему, добавив числа в Driver Version: к вашему итоговому результату следующим образом:

nvidia-smi | awk 'NR>14{SUM+=$6}END{print SUM}'

Эта строка учитывается только в том случае, если она больше чем строка 14 (где данные, о которых вы заботитесь, живут.

Добавление некоторой логики c, чтобы получить максимум и распечатать процесс:

nvidia-smi | awk 'NR>14{SUM+=$6} NR>14 && 0+$6>MAX{MAX=0+$6;MAXSTRING=$6;MAXPID=$3} END{print SUM,MAXPID,MAXSTRING}'

Это выведет сумму, PID, который имел максимальное использование памяти графического процессора и это использование памяти.

Это ломается, хотя, если GPU Memory Usage может переключать устройства (например, между MiB и KiB).

1 голос
/ 21 февраля 2020

Для более эффективного анализа, включающего все метрические единицы СИ c KiB и GiB, вы можете сделать что-то ниже. Это требует GNU awk для сортировки массива

awk '
$6 ~ /[M|K|G]iB/ {
    if ( index( $6, "KiB" ) ) { gsub(/[^0-9]/, "", $6); ram = ($6+0) * 1024 }
    if ( index( $6, "MiB" ) ) { gsub(/[^0-9]/, "", $6); ram = ($6+0) * 1024 * 1024 }
    if ( index( $6, "GiB" ) ) { gsub(/[^0-9]/, "", $6); ram = ($6+0) * 1024 * 1024 * 1024 }
    usage += ram
    map[$3] = 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
    }
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...