Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer les perfs CPU, RAM, Réseau

Récupérer en temps réel les données d'utilisation CPU, RAM, Réseau

Sujet résolu
    2 février 2022 à 9:49:11

    Bonjour,

    Je suis développeur web amateur débutant en PHP.

    Dans l'optique d'un projet personnel de serveur Web sous Windows, j'aimerais pouvoir récupérer les données en temps réel des performances de mon CPU, de ma RAM, de mon Réseau et du stockage de mes Disques Durs.

    En gros, j'aimerai intégrer un visuel sous forme de graphique en temps réel, du moniteur de ressources directement sur mon site (cf. image ci-dessous pour un exemple visuel un peu plus concret) :

    Il s'agit donc de faire cela pour les 4 paramètres que je souhaite voir apparaitre : utilisation CPU, utilisation RAM, Utilisation Réseau et Utilisation de l'espace Disque.

    J'ai d'abord cherché (très longtemps) pour le faire directement en PHP, mais cela est, soit impossible, soit trop contraignant.

    A force de recherche, j'ai trouvé que le meilleur moyen serait surement de créer un script en PowerShell ou un .BAT, que je lancerai ensuite via mon script PHP.

    J'ai donc commencé quelques recherches pour débuter le PowerShell et/ou le Batch mais j'ai un peu de mal. J'avoue que je rechigne à apprendre ces langages car leur syntaxe me déplait au plus haut point. Je suis tombé sur ce lien du site Microsoft et l'utilisation de l'applet "Get-ClusterPerf" mais je n'ai pas tout (voir pas du tout) compris son fonctionnement...

    Je me permets donc un petit post sur ce forum afin d'obtenir un peu d'aide histoire d’accélérer le processus. Pour cela, j'ai plusieurs questions :

    • 1°) Première question : l'utilisation du PowerShell ou Bash vous semble t-elle adapté à mon projet ?
    • 2°) Si oui, par où commencer et quels outils utiliser pour arriver à mes fins ?
    • 3°) Si non, quel langage me conseilleriez-vous ? (C, C++, C#, Python, Java...)

    Sachant que je ne souhaite pas développer un logiciel complet mais juste un script qui me retourne des valeurs toutes les 5-10sec dans le style :

    • CPU = xx%
    • RAM = x Octets / Total Ram
    • Réseau = x Octets / seconde
    • Disque = x Go / Total Capacity

    Valeurs que je pourrais ensuite traiter en PHP pour afficher mes graphiques.

    Je vous remercie d'avoir pris le temps de me lire. J'espère que tout vous paraitra clair et concis.

    Je vous souhaite une bonne journée :)

    Cordialement,

    Xerkes.

    -
    Edité par Xerkes 2 février 2022 à 19:13:09

    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2022 à 17:26:49

      Bonjour,

      Je passais par là sur le forum php.

      Effectivement il faut à partir du php lancer des commandes système pour récupérer les infos. Voir la famille des https://www.php.net/manual/fr/function.exec.php

      Je ne travaille pas sous windows mais sous Linux et il y a un tas d'outils en ligne de commande pour avoir les infos système.

      Quand tu parles de batch, tu ne confondrais pas avec l'interpréteur de commande bash ?

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        2 février 2022 à 19:12:51

        Salut monkey3d,

        merci pour ton intérêt :)

        En effet, je pensais utiliser la fonction exec() de PHP pour lancer un script. Mon soucis c'est que je ne sais pas quoi lancer comme script pour obtenir les valeurs dont j'ai besoin :p

        J'ai vu que sous Linux il y avait effectivement des ressources bien plus simple d'utilisation pour un novice comme moi. Malheureusement, je ne suis pas du tout à l'aise avec ce système d'exploitation. J'ai souvent pensé à m'y mettre, sans jamais concrétiser cela. Peut-être un jour !

        J'ai fait une erreur d’inattention, il s'agit bien du Bash et non du Batch. Je corrige cela de suite dans mon post. Merci !

        Bonne soirée à toi !

        • Partager sur Facebook
        • Partager sur Twitter
          2 février 2022 à 23:25:47

          Bonjour,

          La Cmdlet "Get-ClusterPerf" est comme son nom l'indique plutôt destinés à des clusters, et comme la catégorie l'indique à des espaces de stockages en réseau.

          Avec la Cmdlet "Get-Counter" (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.diagnostics/get-counter?view=powershell-7.2), tu devrais pouvoir trouver ton bonheur.

          Perso, je trouve la syntaxe de PowerShell pas pire que celle de PHP, et j'aime bien le côté orienté objet avec tout le .NET derrière. Il porte bien son nom ce shell.

          Autres pistes:

          - https://www.php.net/manual/en/class.dotnet.php.

          - Avec un serveur SNMP en local: https://www.php.net/manual/en/book.snmp.php.

          Avec Linux, il n'y a pas besoin d'utiliser un script shell. Tout est fichier (plus ou moins), il suffit donc d'aller chercher l'info dans le bon fichier. Je suppose qu'il existe une tonne de script PHP qui le font déjà pour Linux.

          • Partager sur Facebook
          • Partager sur Twitter
            3 février 2022 à 9:26:58

            Salut KoaTao,

            Merci pour ta réponse. Tu m'as donné beaucoup de travail !

            J'ai passé 5h à faire des recherches sur chacun de tes points.

            • Serveur SNMP : Pourrait faire le taf, mais bien trop complexe à mettre en place (à mon niveau) et surtout pas du tout optimisé pour ce que je recherche. Ce serait comme acheter un PC à 10 000€ pour jouer au tétris :p
            • La classe Dotnet en PHP : Déjà la on touche à quelque chose qui ressemble plus à ce que je voudrais. J'ai cherché et cherché encore, déjà pour comprendre le fonctionnement, puis ensuite pour tenter de découvrir quelles assembly .NET étaient liées au taskmgr.exe (Gestionnaire des tâches) de Windows. Après 3h de recherches infructueuses, j'ai décidé de faire une pause.
            • Cmdlet "Get-Counter" : Je crois bien pouvoir dire BINGO. Avant même de commencer à lire ton lien sur la docu, j'ai lancé mon PowerShell, exécuté cette commande et :

            On récupère bien la consommation réseau, l'utilisation CPU et RAM. Il manque l'espace Disque mais honnêtement ça me va. D'autant qu'avec mon projet, il n'arrivera jamais que mes disques soient pleins du jour au lendemain.

            C'est juste parfait.

            Il ne me reste plus qu'à :

            • Créer un script qui me lance cette commande toutes les 10sec.
            • Récupérer ces données et les traiter.
            • Utiliser les données traitées pour créer un graphe et l'afficher sur ma page.

            Franchement niquel. C'est pas fini et j'ai encore beaucoup de travail. Mais le fait d'avancer fait du bien au moral.

            Je te remercie pour ton coup de main :)

            Bonne journée à toi !

            -
            Edité par Xerkes 3 février 2022 à 11:40:15

            • Partager sur Facebook
            • Partager sur Twitter
              5 février 2022 à 8:29:19

              Salut,

              pour ceux que le sujet peut éventuellement intéresser voici comment j'ai fait :

              1°) Script PowerShell, perfServ.ps1, qui lance la commande Get-Counter et l'envoie dans un fichier texte perfServ_LOG.txt dans le dossier d'où est lancé le script ps1 :

              $varCheminRepertoireScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
              $currentScriptName = $MyInvocation.MyCommand.Name #Récupération du nom du script en cours
              
              #On ne prend que le nom du script sans l'extention. Pour cela on chercher la position d'un point en partant de la droite et on prend tout ce qui est à sa gauche
              $currentScriptName = $currentScriptName.substring(0,$($currentScriptName.lastindexofany(".")))
              
              #Création du fichier vierge
              $EmplacementFichier = "$varCheminRepertoireScript\$($currentScriptName)_Log.txt"
              $MonFichier = New-Item -type file $EmplacementFichier -Force
              
              Get-Counter | out-file $MonFichier


              2°) J'utilise la fonction suivante pour lancer le script serfPerf.ps1, puis traiter et récupérer les données souhaitées depuis le fichier texte servPerf_LOG.txt :

              function perfServer()
              {
                  // On lance le script PowerShell perfServer.ps1 qui va écrire la commande Get-Counter dans le fichier perfServ_LOG.txt
                  $output = shell_exec('powershell -executionpolicy remotesigned -command "& {"fonctions/perfServer.ps1"; exit $err}"');
              
                  // Le fichier texte
                  $txt_file = 'fonctions/perfServer_Log.txt';
                  // Variable permettant de parcourir le fichier texte
                  $lines = file($txt_file);
                  // On parcourt le fichier texte ligne par ligne
                  foreach ($lines as $num=>$line)
                  {
                      // Si la ligne = 5 alors on obtient la valeur de consommation du réseau
                      if($num == 5)
                      {
                          $reseau = $line;
                          $reseau = trim($reseau);
                          $reseau = substr($reseau,0,3);                
                      }
                      // Si la ligne = 8 alors on obtient la valeur de consommation du processeur
                      elseif($num == 8)
                      {
                          $processeur = $line;
                          $processeur = trim($processeur);
                          $processeur = substr($processeur,0,3);                
                      }
                      // Si la ligne = 11 alors on obtient la valeur de consommation de la RAM
                      elseif($num == 11)
                      {
                          $ram = $line;
                          $ram = trim($ram);
                          $ram = substr($ram,0,3);
                      }
                  }
                  // On récupère les valeurs dans un tableau
                  $perfServer = array($reseau, $processeur, $ram);
                  // On retourne le tableau
                  return $perfServer;
              }

              Pour le moment, ma fonction est directement sur la page index.php.

              3°) J'appelle ma fonction comme ceci (index.php) :

              <div class="col-xl-4 col-sm-6 grid-margin stretch-card">
                  <div class="card">
                      <div class="card-body">
                          <h4 class="card-title">Network Used</h4>                                                
                              <?php 
                                  $reseau = perfServer();
                                  echo $reseau[0].' Octets / Seconde';                                             
                              ?>
                      </div>
                  </div>
              </div>
              
              <div class="col-xl-4 col-sm-6 grid-margin stretch-card">
                  <div class="card">
                      <div class="card-body">
                          <h4 class="card-title">CPU Used</h4>
                              <?php
                                  $processeur = perfServer();
                                  echo $processeur[1].' %';                                      
                              ?>
                      </div>
                  </div>
              
              </div>
              <div class="col-xl-4 col-sm-6 grid-margin stretch-card">
                  <div class="card">
                      <div class="card-body">
                          <h4 class="card-title">RAM Used</h4>
                              <?php 
                                  $ram = perfServer();
                                  echo $ram[2].' %';                                              
                              ?>
                      </div>
                  </div>        
              </div>

              En visuel, nous obtenons donc l'image suivante :



              Il ne me manque plus que quelques étapes dans lesquelles je galère vraiment car je n'ai jamais touché à JavaScript avant aujourd'hui :

              - J'aimerai lancer un script JS qui relance cette fonction toutes les 20sec et m'affiche les valeurs retournées par le tableau $perfServer[] sur mon index.php en actualisant que le <div id="afficherPerfServer"></div> dans lequel est stocké/affiché ma fonction perfServ() et l'affichage de mes données recueillies.

              Totalité de mon index.php :

              <!-- DEBUT AFFICHAGE DES PERFS DU SERVER -->
              <div class="row" id="afficherPerfServer">
              
                  <script></script>
                  
                  <?php                                   
                      function perfServer()
                      {
                          // On lance le script PowerShell perfServer.ps1 qui va écrire la commande Get-Counter dans le fichier perfServ_LOG.txt
                          $output = shell_exec('powershell -executionpolicy remotesigned -command "& {"fonctions/perfServer.ps1"; exit $err}"');
              
                          // Le fichier texte
                          $txt_file = 'fonctions/perfServer_Log.txt';
                          // Variable permettant de parcourir le fichier texte
                          $lines = file($txt_file);
                          // On parcourt le fichier texte ligne par ligne
                          foreach ($lines as $num=>$line)
                          {
                              // Si la ligne = 5 alors on obtient la valeur de consommation du réseau
                              if($num == 5)
                              {
                                  $reseau = $line;
                                  $reseau = trim($reseau);               
                              }
                              // Si la ligne = 8 alors on obtient la valeur de consommation du processeur
                              elseif($num == 8)
                              {
                                  $processeur = $line;
                                  $processeur = trim($processeur);
                                  //$processeur = substr($processeur,0,3);                
                              }
                              // Si la ligne = 11 alors on obtient la valeur de consommation de la RAM
                              elseif($num == 11)
                              {
                                  $ram = $line;
                                  $ram = trim($ram);
                                  //$ram = substr($ram,0,3);
                              }
                          }
                          // On récupère les valeurs dans un tableau
                          $perfServer = array($reseau, $processeur, $ram);
                          // On retourne le tableau
                          return $perfServer;
                      }
                  ?>
                  
                  <div class="col-xl-4 col-sm-6 grid-margin stretch-card">
                      <div class="card">
                          <div class="card-body">
                              <h4 class="card-title">Network Used</h4>                                                
                              <?php 
                                  $reseau = perfServer();
                                  echo $reseau[0].' Octets / Seconde';                                             
                              ?>
                          </div>
                      </div>
                  </div>
              
                  <div class="col-xl-4 col-sm-6 grid-margin stretch-card">
                      <div class="card">
                          <div class="card-body">
                              <h4 class="card-title">CPU Used</h4>
                              <?php
                                  $processeur = perfServer();
                                  echo $processeur[1].' %';                                      
                              ?>
                          </div>
                      </div>
              
                  </div>
                  <div class="col-xl-4 col-sm-6 grid-margin stretch-card">
                      <div class="card">
                          <div class="card-body">
                              <h4 class="card-title">RAM Used</h4>
                              <?php 
                                  $ram = perfServer();
                                  echo $ram[2].' %';                                              
                              ?>
                          </div>
                      </div>        
                  </div>
              
              </div>
              <!-- FIN AFFICHAGE DES PERFS DU SERVER -->


              Mais je n'y arrive pas. Donc je cherche. Je mettrais la solution (si j'y parviens) à la suite de ce post.

              Voila, j'espère avoir pu vous aider ! Et peut-être que vous pourrez m'aider à finir :)

              Cordialement,

              Xerkes.

              -
              Edité par Xerkes 5 février 2022 à 9:00:15

              • Partager sur Facebook
              • Partager sur Twitter
                5 février 2022 à 21:02:44

                Bonjour,

                C'est déjà un bon début! :)

                De manière générale, en programmation, il est considéré comme une mauvaise pratique de mélanger traitement et affichage. Ça réduit la lisibilité et complexifie inutilement le code (ce qui produit du code de mauvaise qualité).

                La fonction perfServer() ne devrait pas être dans le fichier index.php, et si tu souhaites quand même la laisser dedans, tu devrais la sortir du code HTML.

                Plutôt que d'appeler 3 fois perfServer() d'affilé, ne serait-ce pas plus simple de l'appeler avant, de mettre tout simplement son retour (un array) dans une variable de type array aussi et d'utiliser cette même variable dans chaque div? D'ailleurs, une structure de donnée de type dictionnaire ou tableau associatif serait plus cohérent et augmenterait la lisibilité et la compréhension du code (qui deviendrait plus facilement ouvert à l'évolution).

                exec() (shell_exec()) est à éviter le plus possible. Le plus simple est d'utiliser le planificateur de tâche de Windows pour exécuter le script périodiquement. Ton programme PHP n'aura plus qu'à lire le fichier de log.

                Pour simplifier le traitement en PHP:

                (Get-Counter).CounterSamples | Export-Csv .\perf_data.csv 

                PowerShell est orienté objet. Ici, Get-Counter retourne un Set (une collection) d'objet de type PerformanceCounterSample, pour chaque objet de la collection, je ne garde que la propriété CounterSamples (qui est un tableau de PerformanceCounterSample. J'exporte ce tableau d'objet dans un fichier au format CSV. Ainsi, tu n'as plus qu'à traiter le CSV.

                Pour la partie rafraîchissement, tu peux décomposer ton site en deux partie:

                - index.html (simplement le fichier HTML).

                - perfdata.php (qui retourne les données sur les performances formatées en JSON par exemple).

                Ton script JS fait des requêtes (type AJAX par exemple) à perfdata.php périodiquement pour aller chercher les données fraîches. Ensuite, il te reste plus qu'à manipuler la DOM (et l'affichage évoluera dynamiquement). En JS, tu peux utiliser setTimeout() avec un callback pour exécuter tes requêtes périodiquement.

                Bon courage!

                • Partager sur Facebook
                • Partager sur Twitter
                  6 février 2022 à 18:14:11

                  Bonsoir Koatao,

                  Merci pour ton intérêt :)

                  Je ne pensais pas que quelqu'un répondrait sur ce post !

                  Pour infos, voila où j'en suis actuellement : Voir dernier post en date

                  Comme tu pourras le voir (si cela t'intéresse bien-sur ^^), j'avais déjà placé ma fonction dans une autre page. Et BrainError m'a donné un script (que je commence à comprendre) pour actualiser mon div et qui fonctionne plutôt bien malgré quelques petits soucis.

                  Dans tous les cas je suis en train d'essayé d'optimiser tout cela, et ton idée de .CSV au lieu d'un texte m'apparait comme la solution à un problème que je rencontre donc merci beaucoup pour ton aide.

                  Je te souhaite une bonne soirée et une bonne semaine à venir !

                  Cordialement,

                  Xerkes.

                  -
                  Edité par Xerkes 6 février 2022 à 18:14:48

                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 février 2022 à 11:55:07

                    csv c'est un fichier texte avec un séparateur (virgule, point virgule, tabulation, ...) entre les données d'une ligne, ce qui est peut-être déjà le cas dans ton fichier texte.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 février 2022 à 12:00:17

                      Salut,

                      Après la réponse de Koatao j'ai modifié tout mon code pour utiliser un CSV au lieu d'un TXT car le TXT renvoyait des caractères invisibles et je ne pouvais donc pas traiter mes données de manière adéquat.

                      Je vous renvois à mon autre post qui explique tout mon nouveau code et qui est en attente d'une demande particulière.

                      Si cela vous intéresse vous pouvez venir y jeter un coup d’œil et dire coucou :)

                      Merci tout de même pour votre réponse.

                      Cordialement,

                      Xerkes.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Récupérer les perfs CPU, RAM, Réseau

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown