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"
Répondre
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. '
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? –
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. –
- 1. Détermination du système CLR Directory
- 2. Détermination du type d'élément WPF
- 3. Détermination du modèle d'iPhone
- 4. Détermination de la taille du fichier image + dimensions via Javascript?
- 5. Détermination du côté serveur de la visibilité de l'élément HTML
- 6. Détermination du composant flash chargé
- 7. Détermination du nom de l'exécutable C
- 8. Détermination de la fréquence des lettres du texte chiffré
- 9. Détermination de la connexion Internet du client (InternetGetConnectedState() est)
- 10. Détermination du nom de la fonction dans AS2 et AS3
- 11. Le système rencontre un problème pour la prise en charge
- 12. Détermination du fichier que vous utilisez
- 13. Étendue du système dans l'analyse du système
- 14. tester la charge avec vs2008, comment puis-je obtenir des statistiques du système sous test?
- 15. Détermination dynamique du chemin dans Silverlight 2
- 16. Détermination de la vitesse de vibration
- 17. permettre au système de prendre en charge plusieurs langues
- 18. Détermination de la portée d'une cible MemberExpressions
- 19. Détermination de la durée d'immobilisation d'une touche
- 20. C# Charge de réflexion "Système" d'assemblage sans FQN
- 21. Détermination de l'existence du dossier sur la machine du client dans GWT
- 22. Détermination champ de formule
- 23. générer la charge du processeur en Java
- 24. Détermination du serveur de noms qui a effectué une résolution
- 25. Détermination du nom de fichier (ouvert) à partir d'un fichier *
- 26. Détermination du codec vidéo via l'API de données YouTube?
- 27. Détermination du répertoire de travail d'un autre programme
- 28. Surveiller la charge du processeur sous XP par programmation
- 29. Suivre l'activité du système
- 30. Script du système Webmail
Cette question peut mieux répondre à http://serverfault.com/ – kdmurray
Il demande spécifiquement C# alors SO est le bon endroit – Alex