2009-06-06 8 views
3

Est-ce que quelqu'un connaît un moyen élégant de déterminer "Charge du système" de préférence en utilisant les compteurs de performance Windows? Dans ce cas, je veux dire "System Load" dans le sens classique (UNIX) du terme et non dans le pourcentage d'utilisation du CPU "Confus". Selon mes lectures ... "System Load" est généralement représenté comme un flottant, définissant le nombre de processus dans un état exécutable (c'est-à-dire n'incluant pas le nombre de processus qui sont actuellement bloqués pour une raison ou une autre) qui pourrait être courir à un moment donné. Wikipedia donne une bonne explication ici - http://en.wikipedia.org/wiki/Load_(computing). En cours de route, je travaille en C#, donc tous les exemples dans cette langue seraient grandement appréciés.Détermination de la "charge du système"

+0

Cette question peut mieux répondre à http://serverfault.com/ – kdmurray

+0

Il demande spécifiquement C# alors SO est le bon endroit – Alex

Répondre

4

La charge du système, au sens UNIX (et si je me souviens bien), est le nombre de processus qui peuvent être exécutés et qui ne s'exécutent pas réellement sur une CPU (moyenné sur une période donnée). Des utilitaires tels que top affichent cette charge, par exemple, les 1, 5 et 15 dernières minutes.

Je ne crois pas que cela soit possible avec les classes Win32 WMI standard. Le champ d'état du processus (ExecutionState) dans les objets WMI Win32_Process est documenté comme n'étant pas utilisé.

Toutefois, la classe de threads fournit cette information (et c'est probablement un meilleur indicateur car les systèmes d'exploitation modernes ont tendance à programmer des threads plutôt que des processus). La classe Win32_Thread a un champ ExecutionState qui est fixé à l'un de:

  • 0 Inconnu
  • 1 Autres
  • 2 Ready
  • 3 course
  • 4 Bloqué
  • 5 Suspendu bloqué
  • 6 Suspendu Prêt

Si vous deviez faire une requête de cette classe et comptez le nombre de type 2 (et éventuellement de type 6; Je pense que les moyens suspendus ont été échangés dans ce contexte), cela devrait vous donner l'instantané de votre charge. Vous devrez alors les calculer vous-même si vous voulez des moyennes.

En variante, il y a un ThreadState dans cette catégorie aussi bien:

  • 0 initialisées (reconnu par le micronoyau).
  • 1 Prêt (prêt à fonctionner sur le prochain processeur disponible).
  • 2 Exécution (en cours). 3 Standby (sur le point de s'exécuter, un seul thread peut être dans cet état à la fois).
  • 4 Terminé (exécution terminée).
  • 5 En attente (pas prêt pour le processeur, lorsqu'il est prêt, il sera replanifié).
  • 6 Transition (attente de ressources autres que le processeur).
  • 7 Inconnu (l'état est inconnu). afin que vous puissiez envisager de compter ceux dans l'état 1 ou 3.

Ne me demandez pas pourquoi il y a deux champs montrant des informations similaires ou quelle est la différence. J'ai depuis longtemps arrêté de deviner Microsoft avec leurs infos WMI, je dois juste convaincre les pouvoirs que mon choix est viable :-)

Après avoir fini de développer un client Windows pour notre propre application de surveillance , Je suggère simplement de prendre des instantanés d'une seconde et de les calculer en moyenne sur toute la période dont vous avez besoin pour faire un rapport. VBScript et WMI semblent remarquablement résilients même à une requête par seconde - il ne semble pas trop absorber le CPU et, tant que vous libérez tout ce que vous utilisez, vous pouvez courir pendant de longues périodes.

Ainsi, chaque seconde, vous feriez quelque chose comme (en VBScript, et de la mémoire puisque je n'ai pas accès au code d'ici):

set objWmi = GetObject("winmgmts:\\.\root\cimv2") 
set threadList = objWmi.ExecQuery("select * from Win32_Thread",,48) 
sysLoad = 0 
for each objThread in threadList 
    if objThread.ThreadState = 1 or objThread.ThreadState = 3 then 
     sysLoad = sysLoad + 1 
    end if 
next 
' sysLoad now contains number of threads waiting for a CPU. ' 
+0

Pax - merci pour la réponse, cela aide beaucoup. J'ai cependant une question de suivi, si je me souviens bien charger quand montré avec des systèmes comme "top" représente la valeur comme un flotteur (ie 1.35 ou 5.45). Dans votre exemple, vous n'obtiendrez que des nombres entiers pour la charge du système. Une idée où les valeurs fractionnaires entrent dans plat? –

+0

Peu importe ... mon stupide ... ces valeurs sont les moyennes sur 1, 5 et 15 minutes. Pour une raison quelconque, j'ai continué à penser que la première valeur était vraiment un seul point dans le temps, pas une moyenne sur une petite période. –

Questions connexes