Radeontop : récupérer les données brutes

Bonjour,

Pour les gens qui ne me connaissent pas, vous devez savoir que
j'aime les stats
Vous pouvez donc deviner mon bonheur quand j’ai découvert que la commande radeontop était capable de récupérer les informations sur l’occupation du processeur et de la mémoire de la carte graphique de ma machine.
Le problème, c’est que radeontop formate tout ça pour un affichage pour l’humain

┌ (almtesh@Thorn + 0) (15/04/23 - 7:36:43) (1.23 - 0%) (~)
└% radeontop --dump - --limit 1
Unknown Radeon card. <= R500 won't work, new cards might.
Dumping to -, line limit 1.
1681538724.556202: bus 03, gpu 5.83%, ee 0.00%, vgt 1.67%, ta 0.00%, tc 0.00%, sx 1.67%, sh 1.67%, spi 2.50%, smx 1.67%, cr 0.00%, sc 3.33%, pa 0.83%, db 2.50%, cb 3.33%, vram 7.56% 769.86mb, gtt 2.55% 201.69mb, mclk 9.60% 0.096ghz, sclk 18.52% 0.500ghz

J’aimerai récupérer la donnée brute pour pouvoir la grapher dans mon cacti, mais ce que j’ai trouvé de plus exploitable est ce qui se trouve ci-dessus.
Je pourrais tenter d’en faire quelque chose, mais si je pouvais récupérer quelque chose de moins formaté, ce serait plus simple à traiter.

Si vous avez des idées, n’hésitez pas !

Hello,

Tu peux :

  • utiliser awk pour récupérer les champs désirés

  • modifier les fprintf dans le source dump.c et recompiler

$ radeontop --dump - --limit 1| tr ':' '\n' |tr "," "\n"|sed 's#^ \([^ ]*\) \(.*\)#\1\t\2#'
1681538724.556202
bus	03
gpu	5.83%
ee	0.00%
vgt	1.67%
ta	0.00%
tc	0.00%
sx	1.67%
sh	1.67%
spi	2.50%
smx	1.67%
cr	0.00%
sc	3.33%
pa	0.83%
db	2.50%
cb	3.33%
vram	7.56% 769.86mb
gtt	2.55% 201.69mb
mclk	9.60% 0.096ghz
sclk	18.52% 0.500ghz

\1 est la première colonne
\t une tabulation
\2 ladeuxième

J’y ai pensé, pour l’occupation du processeur, va convenir car c’est la données que je veux, mais pour la mémoire, je ne vois pas du tout comment formater correctement la valeur.
Je souhaite obtenir la mémoire utilisée et la mémoire totale, si possible en octets ou dans un multiple qui ne bouge pas et que je peux multiplier de façon fixe.
Je peux obtenir la mémoire totale en divisant la mémoire utilisée par le pourcentage d’utilisation, mais ça me paraît un peu bancal.

Je viens de tester, mais ça ne fait que changer les virgules par des retours à la ligne, mais ça ne change pas grand chose.
S’il s’agissait de me proposer un affichage plus clair visuellement, radeontop me donne déjà un visuel assez clair :

              radeontop unknown, running on UNKNOWN_CHIP bus 03, 120 samples/sec               
                                                │
                          Graphics pipe   5,00% │  
────────────────────────────────────────────────┼──────────────────────────────────────────────
                           Event Engine   0,00% │
                                                │
            Vertex Grouper + Tesselator   0,83% │
                                                │
                      Texture Addresser   0,00% │
                          Texture Cache   0,00% │
                                                │
                          Shader Export   1,67% │ 
            Sequencer Instruction Cache   0,83% │
                    Shader Interpolator   1,67% │ 
                 Shader Memory Exchange   0,00% │
                                                │
                         Scan Converter   0,00% │
                     Primitive Assembly   1,67% │ 
                                                │
                            Depth Block   0,00% │
                            Color Block   0,00% │
                         Clip Rectangle   0,00% │
                                                │
                     742M / 10166M VRAM   7,29% │   
                       213M / 7922M GTT   2,68% │ 
             0,10G / 1,00G Memory Clock   9,60% │    
             0,50G / 2,70G Shader Clock  18,52% │        
                                                │

Il y a une barre pour chaque valeur (on ne la voit pas sur ma capture) et on peut avoir des couleurs.

Alors, j’ai ajouté l’utilisation du processeur

/bin/sh -c "/usr/sbin/radeontop --dump - --limit 1 | /usr/bin/grep -oE 'gpu [0-9.]*' | /usr/bin/grep -oE '[0-9.]*'"

et de la mémoire

/bin/sh -c "/usr/bin/python3 -c 'print (int ('$(/usr/sbin/radeontop --dump - --limit 1 | /usr/bin/grep -oE 'vram [0-9.]*% [0-9.]*mb' | /usr/bin/sed 's|vram [0-9.]*% ||; s|mb||')'*1048576))'"

et oui, j’ai un style assez particulier.
Je n’ai pas encore créé la commande pour récupérer la mémoire totale, mais je sens que ça va être méga moche.

Le mieux est l’ennemi du bien, j’en ai des tas des scripts mega moche, l’important est le commentaire pour comprendre ce qu’il fait à l’horizon de sa mémoire.

Et voilà pour la mémoire totale :

/bin/sh -c "/usr/bin/python3 -c 'd='"'$('"/usr/sbin/radeontop --dump - --limit 1 | /usr/bin/grep -oE 'vram [0-9.]*% [0-9.]*mb' | /usr/bin/sed 's|vram |(|; s|% |,|; s|mb|)|')'; print (int ((d [1]*1048576)/(d [0]/100)))'"

Le problème, c’est que cette commande déduit la mémoire totale en multipliant la mémoire utilisée par le pourcentage d’utilisation, les arrondis font que la valeur n’est pas la même à chaque exécution de la commande.

Résumé

Pas sûr que ça réponde tout à fait à ce que tu veux mais pour obtenir la mémoire totale, j’aurais fait un truc comme ça (à supposer que la barre en couleur pour chaque valeur est fournie à droite de la colonne de ‹ | ›):

radeontop --dump - --limit 1 | awk '/VRAM/ {printf $3}'

Du coup, pour la ram consommée, ça ferait un truc du genre:

radeontop --dump - --limit 1 | awk '/VRAM/ {printf $1}'

Et pour un combo des 2:

radeontop --dump - --limit 1 | awk '/VRAM/ {printf "VRAM:\n  - conso: " $1 "\n  - total: " $3}'

ce qui te renvoie:

VRAM:
  - conso: 742M
  - total: 10166M

J’ai rien dit… je repartais de ta sortie au lieu de la donnée d’entrée… gros confusage