Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mésurer performance

CPU/Mémoty de certains process dotnet, mesurés depuis proces dotnet

    17 octobre 2018 à 14:55:34

    Bonjour.

    J'ai un petit projet subdivisé en 3 process tournants individuellement, il s'agit d'un CRM:

    • App (projet angular 6 qui sera probablement accouplé à un webserver nodejs ou dotnet mvc)
    • Api (projet dotnet mvc avec EF Core)
    • Auth (projet dotnet mvc avec IdentityServer4)

    Ils tournent ensemble et pour l'instant ça fonctionne xD

    Depuis, j'ai eu envie de pouvoir mesurer la performance de chacun des 3 process, et les faire afficher (avec des graphes, pies, etc) dans une dashboard du CRM.

    J'avais donc commencé par établir un Hub SignalR entre le client angular (App) et l'API. Utilisant les packages suivants:

    • @aspnet/signalr pour l'appli
    • Microsoft.AspNetcore.SignalR pour l'API

    En faisant comme ça, j'ai pu envoyer des données chaque x seconde(s) depuis l'api vers le client (stream continu). Ces données provenaient d'un PerformanceCounter configuré dans l'API pour renvoyer la quantité de mémoire et "process time" du serveur faisant tourner les 3 process.

    Le souci aujourd'hui est premièrement, que je ne développe plus sur Windows mais sur Kali linux ==> System.Diagnostics.PerformanceCounter ne fonctionne pas. Et deuxièmement, ça ne collecte pas vraiment les données comme je voudrais, moi ce que je voulait était être capable de collector l'utilisation CPU/Mémoire de CHAQUE process du projet (et pas de la machine seulement).

    J'ai fait mes recherches et tombe toujours sur les mêmes propositions sur le net:

    • Utiliser les EventCounter à la place des PerformanceCounter ==> Mais là, il y a 0 exemple valable de comment le faire. Je ne sais vraiment pas quoi faire de ce "tutoriel"
    • Utiliser Metrics.NET pour tenir des compteurs, des jauges, des mesures ==> Mais je ne vois toujours pas comment collecter l'utilisation CPU/Mémoire (En plus, le projet n'est plus vraiment entretenu et semble laisser AppMetrics prendre la relève)
    • Utiliser Grafana / InfluxDB / Grafite et je ne sais quels autres frameworks/packages pour faire apparaître des graphiques dans des dashboards, pour utiliser des "time series", etc ==> Mais là on s'écarte complètement, mais vraiment, de l'idée de départ : Collecter depuis un process dotnet ==> Grafana et InfluxDB sont visiblement des petits engins qui tournent individuellement et on leurs propres dépendances ==> Je n'en veux pas trop car je voudrais qu'au final, le tout puisse être hébergé sur quasi tout type d'environment sans avoir à m'assurer que Docker soit présent.
    • Process.GetCurrentProcess() et regarder les propriétés du process ==> Ce qui ressemble le plus à mon utilisation de PerformanceCounter, le souci c'est que les propriétés du process ne changent pas ... .WorkingSet64 a toujours la même valeur et .TotalProcessorTime est toujours à 0. Avec les PerformanceCounter, il y avait la methode .NextValue() qui permettait de recalculer les valeurs à chaque fois.

    Pour finir, je me dis qu'il vaut tout simplement mieux reposer la question :D

    Quelqu'un connait-il un moyen de collecter en c#/dotnet core l'utilisation CPU/Mémoire de certains processus/machines ?

    Si jamais il faut créer un 4ème projet tournant à coté des 3 autres ==> pas de souci, ça me semble même plus logique.

    Merci d'avance et bien à vous !

    Jin-K

    -
    Edité par Jin-K 17 octobre 2018 à 14:56:21

    • Partager sur Facebook
    • Partager sur Twitter
      17 octobre 2018 à 16:54:04

      Sauf erreur de la documentation, PerformanceCounter est disponible sur la version .NET Core, elle-même disponible sur Mac et Linux, depuis la version 2.0 :

      https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.performancecounter?view=netcore-2.0

      Quel version du framework .NET utilisez-vous ?

      >je voulait était être capable de collector l'utilisation CPU/Mémoire de CHAQUE process

      Je ne sais pas sous Kali Linux, mais les compteurs de performance ont un niveau de finesse qui devrait largement suffire, cf. une copie d'écran de "perfmon" sous Windows qui affiche l'ensemble des compteurs de performance disponible :

      Je ne vois donc pas trop le problème. :-°

      -
      Edité par bacelar 17 octobre 2018 à 17:26:01

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        17 octobre 2018 à 23:24:12

        Salut bacelar, merci pour ta réponse ! 

        Et bien en effet la classe existe car j'arrivais à compiler. D'ailleurs je pense avoir eu a rajouter une reference vers le package qui porte le même nom "System.Diagnostics.PerformanceCounter.dll" que la classe.

        Mais ça ne fonctionne pas sous Linux, j'obtenais un message d erreur à l'execution. Je ne me souviens plus exactement du message d'erreur, mais il disait quelque chose d'assez formel du genre: "PerformanceCounter ne fonctionne pas sur votre système", je devrais reverifier quand je serais chez moi.

        Il me semble que de toute façon, le concept de PerformanceCounter ne peut fonctionner que sur Windows.

        Edit: J'utilise la version .net core 2.1

        Et voilà la classe où le PerformanceCounter ne fonctionnait pas: 

        https://github.com/Jin-K/simple-crm/blob/fuse-ui/SimpleCRM.Api/Hubs/DashboardHub.cs

        -
        Edité par Jin-K 17 octobre 2018 à 23:33:46

        • Partager sur Facebook
        • Partager sur Twitter
          18 octobre 2018 à 11:06:32

          Peux-tu nous fournir le message d'erreur complet, ainsi que ceux de ses InnerException ?
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

          Mésurer performance

          × 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