PowerJoular : Un outil puissant pour monitorer la consommation électrique sous Linux

surveiller en temps réel la consommation électrique des composants matériels et logiciels d’un ordinateur

fred

PowerJoular : Un outil puissant pour monitorer la consommation électrique sous Linux

PowerJoular est un logiciel libre en ligne de commande conçu pour surveiller en temps réel la consommation électrique des composants matériels et logiciels d’un ordinateur. Développé par Adel Noureddine de l’Université de Pau et des Pays de l’Adour, cet outil s’avère particulièrement utile pour les développeurs, les administrateurs systèmes et les chercheurs soucieux de l’efficacité énergétique de leurs systèmes.

Fonctionnalités principales

PowerJoular offre plusieurs fonctionnalités clés :

  • Surveillance de la consommation électrique du CPU et du GPU sur PC et serveurs
  • Monitoring de la consommation dans les machines virtuelles
  • Suivi de la consommation de processus individuels sous GNU/Linux
  • Exposition des données de consommation via le terminal et des fichiers CSV
  • Service systemd pour un monitoring continu
  • Faible surcharge grâce à son implémentation en Ada

Plateformes supportées

L’outil est compatible avec :

  • Les PC et serveurs équipés de processeurs Intel (depuis Sandy Bridge) ou AMD (Ryzen ou EPYC) supportant RAPL
  • Les cartes graphiques NVIDIA
  • Les Raspberry Pi (plusieurs modèles) et Asus Tinker Board
  • Les machines virtuelles sur les plateformes hôtes supportées

PowerJoular fonctionne actuellement uniquement sous GNU/Linux.

Installation et utilisation

Pour installer PowerJoular, vous pouvez le compiler à partir des sources ou utiliser les paquets précompilés disponibles pour certaines distributions. La compilation nécessite un compilateur Ada moderne comme GNAT.

L’utilisation de base se fait via la commande :

sudo powerjoular

Les privilèges root sont nécessaires sur les noyaux Linux récents pour accéder aux interfaces de mesure de consommation.

Options de monitoring et d’enregistrement

PowerJoular offre plusieurs options pour personnaliser le monitoring :

  • -p pid : surveiller un PID spécifique
  • -a appName : surveiller tous les processus d’une application donnée
  • -f filename : sauvegarder les données dans un fichier
  • -o filename : sauvegarder uniquement les dernières mesures (écrasement du fichier)
  • -t : afficher les données énergétiques dans le terminal

Publication et visualisation de l’historique

Pour publier et visualiser l’historique de consommation, vous pouvez suivre ces étapes :

  1. Enregistrement continu des données :
    Utilisez le service systemd fourni avec PowerJoular pour un monitoring continu. Le service sauvegarde les données dans /tmp/powerjoular-service.csv.

  2. Traitement des données :
    Vous pouvez écrire un script pour traiter régulièrement le fichier CSV généré, par exemple pour agréger les données sur des intervalles plus longs ou calculer des moyennes.

  3. Stockage à long terme :
    Stockez les données traitées dans une base de données temporelle comme InfluxDB ou TimescaleDB pour une gestion efficace de l’historique.

  4. Visualisation :
    Utilisez des outils de visualisation comme Grafana pour créer des tableaux de bord interactifs. Connectez Grafana à votre base de données pour afficher l’évolution de la consommation au fil du temps.

  5. Alertes :
    Configurez des alertes dans Grafana ou votre système de monitoring pour être notifié en cas de pics de consommation anormaux.

  6. API d’exposition :
    Développez une API simple (par exemple avec Flask ou FastAPI) pour exposer les données de consommation, permettant ainsi à d’autres applications de les consommer.

  7. Analyse approfondie :
    Utilisez des outils d’analyse de données comme Python avec Pandas et Matplotlib pour effectuer des analyses plus poussées sur les données historiques.

En combinant PowerJoular avec ces techniques de publication et de visualisation, vous obtiendrez une solution complète pour surveiller, analyser et optimiser la consommation électrique de vos systèmes Linux sur le long terme.

Citations:
[1] https://github.com/joular/powerjoular
[2] https://www.noureddine.org/articles/monitor-the-power-consumption-of-hardware-and-software-with-powerjoular

Pour développer une API simple permettant d’exposer les données de consommation électrique collectées par PowerJoular, je vous recommande d’utiliser FastAPI. Bien que Flask soit également une excellente option, FastAPI offre plusieurs avantages pour ce type de projet, notamment en termes de performances et de facilité d’utilisation. Voici comment vous pourriez procéder :

Mise en place de l’API avec FastAPI

  1. Installation des dépendances :
    Commencez par installer FastAPI et ses dépendances :

    pip install fastapi uvicorn pandas
    
  2. Structure du projet :
    Créez un fichier main.py pour votre API.

  3. Code de base :
    Voici un exemple de code pour votre API :


    from fastapi import FastAPI, HTTPException from pydantic import BaseModel import pandas as pd from typing import List import datetime import uvicorn app = FastAPI() # Chemin vers votre fichier CSV CSV_FILE = "/chemin/vers/votre/fichier/powerjoular-data.csv" class PowerData(BaseModel): timestamp: datetime.datetime cpu_power: float gpu_power: float total_power: float def load_csv(): try: df = pd.read_csv(CSV_FILE, header=None, names=['timestamp', 'cpu_power', 'gpu_power', 'total_power'], parse_dates=['timestamp']) return df except Exception as e: raise HTTPException(status_code=500, detail=f"Erreur lors de la lecture du fichier CSV : {str(e)}") @app.get("/power/latest", response_model=PowerData) async def get_latest_power_data(): df = load_csv() latest = df.iloc[-1] return PowerData( timestamp=latest['timestamp'], cpu_power=latest['cpu_power'], gpu_power=latest['gpu_power'], total_power=latest['total_power'] ) @app.get("/power/history", response_model=List[PowerData]) async def get_power_history(start: datetime.datetime = None, end: datetime.datetime = None): df = load_csv() if start: df = df[df['timestamp'] >= start] if end: df = df[df['timestamp'] <= end] return [PowerData(**row) for row in df.to_dict('records')] if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument("--port", type=int, default=8000, help="Port sur lequel exécuter l'API") args = parser.parse_args() uvicorn.run(app, host="0.0.0.0", port=args.port)
  4. Lancement de l’API :
    Lancez votre API avec la commande :

    python powerjoular.py --port 8080

        5. Accédez à l’API via :

La documentation interactive de l’API sera disponible à http://localhost:8080/docs

Fonctionnalités de l’API

Cette API propose deux endpoints principaux :

  • /power/latest : renvoie les dernières données de consommation enregistrées.
  • /power/history : renvoie l’historique des données de consommation, avec la possibilité de filtrer par date.

Avantages de cette approche

  • Performance : FastAPI est connu pour ses performances élevées, ce qui est crucial pour traiter de grandes quantités de données.
  • Documentation automatique : FastAPI génère automatiquement une documentation interactive (accessible via /docs).
  • Validation des données : Utilisation de Pydantic pour la validation des données d’entrée et de sortie.
  • Asynchrone par défaut : Permet de gérer efficacement de nombreuses requêtes simultanées.

Améliorations possibles

  • Mise en cache : Implémentez un système de cache pour réduire la charge sur le fichier CSV ou la base de données.
  • Agrégation des données : Ajoutez des endpoints pour obtenir des données agrégées (moyennes horaires, journalières, etc.).
  • Authentification : Ajoutez une couche d’authentification pour sécuriser l’accès à l’API.
  • Temps réel : Utilisez WebSockets pour fournir des mises à jour en temps réel des données de consommation.

Cette API simple vous permettra d’exposer facilement les données de consommation collectées par PowerJoular, les rendant accessibles à d’autres applications ou services pour une analyse plus approfondie ou une intégration dans des tableaux de bord de monitoring.

Citations:
[1] https://www.wolframalpha.com/input?input=Flask+vs+FastAPI+comparison
[2] https://www.wolframalpha.com/input?input=Flask+or+FastAPI+for+building+APIs
[3] https://www.wolframalpha.com/input?input=advantages+of+Flask+vs+FastAPI
[4] https://www.wolframalpha.com/input?input=which+is+better+Flask+or+FastAPI


power_api.py


from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from pydantic import BaseModel
import csv
from datetime import datetime
import uvicorn

app = FastAPI()

class PowerData(BaseModel):
    timestamp: str
    variation: float
    total_power: float
    cpu_power: float
    gpu_power: float

def read_latest_power_data():
    try:
        with open('/tmp/powerjoular-service.csv', 'r') as f:
            reader = csv.reader(f)
            last_row = list(reader)[-1]
            return PowerData(
                timestamp=last_row[0],
                variation=float(last_row[1]),
                total_power=float(last_row[2]),
                cpu_power=float(last_row[3]),
                gpu_power=float(last_row[4])
            )
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Erreur lors de la lecture des données : {str(e)}")

@app.get("/power", response_model=PowerData)
async def get_power():
    return read_latest_power_data()

@app.get("/power/{metric}")
async def get_power_metric(metric: str):
    data = read_latest_power_data()
    if hasattr(data, metric):
        return JSONResponse(content={metric: getattr(data, metric)})
    else:
        raise HTTPException(status_code=404, detail=f"Métrique '{metric}' non trouvée")

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=22407)