Munin est un traceur de graphes : il permet de suivre l’évolution de n’importe quelle donnée rapidement et simplement  via un serveur web. Par défaut, munin ne trace rien ; il dépend de plugins qu’il appelle via son sous programme munin-node. Ces derniers sont des scripts ou programmes qui suivent une sémantique particulière.

Latence des stockages – Germanium 4


Architecture d’un plugin

L’écriture du code additionnel n’est pas compliquée, il suffit de manipuler la sortie standard depuis n’importe quel langage pour passer les données et la configuration, cependant quelques règles doivent absolument être respectées :

  • L’exécution avec l’argument config retourne la configuration du graphe
~/munin-dev: ./cpupower config
graph_title CPU frequency
graph_category sensors
graph_vlabel MHz
cpu_power.label Package power
memory_power.label Memory Power
core_power.label Core Power
uncpu_power.label Uncore Power
  • L’exécution sans arguments retourne les noms des données suivies des valeurs
~/munin-dev: ./cpupower
cpu_power.value 5.447740J
memory_power.value 1.213010J
core_power.value 0.072815J
uncore_power.value 0.000000J
  • L’exécution avec un argument autre que config renvoie un descriptif
~/munin-dev: ./cpupower 1
cpupower - munin plugin to plot cpu power package
Usage: cpupower [config]

Sous réserve de respecter ces 3 critères sur stdout, le plugin peut être écrit avec n’importe quel langage scripté ou compilé.


Monitoring énergétique

Nous allons utiliser le programme libre rapl-read qui permet de lire l’état des registres MSR pour différentes générations de processeurs Intel. On pourra lire la consommation :

  • Du package, donc l’ensemble des systèmes du CPU
  • De la mémoire vive
  • Du cœur
  • Du reste (ALU, FPU, L1, l2, etc), aussi appelé uncore ou system agent

Note : Je n’arrive pas à accéder à la consommation énergétique uncoreje pense que ça vient du CPU pirate que j’utilise (4980HQ). Si quelqu’un a une solution, je suis preneur.

wget https://raw.githubusercontent.com/deater/uarch-configure/master/rapl-read/rapl-read.c

Il suffit ensuite de le compiler pour l’architecture du système :

gcc rapl-read.c -o rapl-read -O2 -Wall -lm

Puis de déplacer le programme dans /usr/bin :

 mv rapl-read /usr/bin/

Maintenant que les dépendances sont satisfaites, il est temps d’implanter dans /usr/share/munin/plugins le script bash du plugin correspondant que l’on nommera cpupower :

#!/bin/sh
# CPU power plotting - Douay Corentin - Arkange

output_config() {
    echo "graph_title CPU power"
    echo "graph_category sensors"
    echo "graph_vlabel Watts"
    echo "cpu_power.label Package"
    echo "memory_power.label Memory"
    echo "core_power.label Core"
    echo "uncpu_power.label Uncore"
}

output_values() {
    rapl=/usr/bin/rapl-read

    cpu_pow=`$rapl|grep package-0|awk '{print $NF}'| rev | cut -c 2- | rev`
    memory_pow=`$rapl|grep ram|awk '{print $NF}'| rev | cut -c 2- | rev`
    core_pow=`$rapl|grep core|awk '{print $NF}'|sed -n '2p'| rev | cut -c 2- | rev`
    uncore_pow=`$rapl|grep uncore|awk '{print $NF}'| rev | cut -c 2- | rev`

    printf 'cpu_power.value '$cpu_pow'\n'
    printf 'memory_power.value '$memory_pow'\n'
    printf 'core_power.value '$core_pow'\n'
    printf 'uncore_power.value '$uncore_pow'\n'
}

output_usage() {
    printf >&2 "%s - munin plugin to plot cpu power package\n" ${0##*/}
    printf >&2 "Usage: %s [config]\n" ${0##*/}
}

case $# in
    0)
        output_values
        ;;
    1)
        case $1 in
            config)
                output_config
                ;;
            *)
                output_usage
                exit 1
                ;;
        esac
        ;;
    *)
        output_usage
        exit 1
        ;;
esac

On tire ensuite un lien du répertoire de stockage des plugins de munin jusqu’au répertoire d’exploitation :

ln -s /usr/share/munin/plugins/cpupower /etc/munin/plugins

Et on recharge munin-node :

systemctl restart munin-node

On vérifie que le plugin est bien actif avec munin-node-configure :

munin-node-configure | grep cpu
cpu                        | yes  |
cpufreq                    | yes  |
cpupower                   | yes  |
cpuspeed                   | no   |
lpar_cpu                   | no   |
vserver_cpu_               | no   |

Il ne reste plus qu’à tester manuellement le plugin avec munin-run :

munin-run cpupower
cpu_power.value 7.649944
memory_power.value 1.215573
core_power.value 0.433166
uncore_power.value 0.000000

Après quelques minutes, on pourra voir le graphe apparaître dans l’onglet sensors :

Consommation énergétique – Germanium 5

 


0 commentaire

Laisser un commentaire