Informations sur le CPU
But
Via WMI
Root\CIMV2\Win32_Processor
- wql sur root/CIMV2
Select * from Win32_Processor
instance of Win32_Processor show{ AddressWidth = 64; Architecture = 9; AssetTag = “To Be Filled By O.E.M.”; Availability = 3; Caption = “Intel64 Family 6 Model 158 Stepping 9”; Characteristics = 252; CpuStatus = 1; CreationClassName = “Win32_Processor”; CurrentClockSpeed = 3600; CurrentVoltage = 10; DataWidth = 64; Description = “Intel64 Family 6 Model 158 Stepping 9”; DeviceID = “CPU0”; ExtClock = 100; Family = 198; L2CacheSize = 1024; L3CacheSize = 8192; L3CacheSpeed = 0; Level = 6; LoadPercentage = 2; Manufacturer = “GenuineIntel”; MaxClockSpeed = 3600; Name = “Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz”; NumberOfCores = 4; NumberOfEnabledCore = 4; NumberOfLogicalProcessors = 8; PartNumber = “To Be Filled By O.E.M.”; PowerManagementSupported = FALSE; ProcessorId = “BFEBFBFF000906E9”; ProcessorType = 3; Role = “CPU”; SecondLevelAddressTranslationExtensions = FALSE; SerialNumber = “To Be Filled By O.E.M.”; SocketDesignation = “U3E1”; Status = “OK”; StatusInfo = 3; SystemCreationClassName = “Win32_ComputerSystem”; SystemName = “PC-THIERRY”; ThreadCount = 8; UpgradeMethod = 1; Version = “”; VirtualizationFirmwareEnabled = FALSE; VMMonitorModeExtensions = FALSE; };
LoadPercentage
Type - UInt16
La propriété LoadPercentage
indique la capacité de charge de chaque processeur calculée sur la dernière seconde.
Le terme 'processor loading' réfère à la charge de traitement totale supportée par chaque processeur en une fois.
ProcessorId
Type - String
La propriété ProcessorId
contient des informations spécifiques au processeur qui décrivent ses fonctionnalités. Pour les processeurs de classe x86, le format du champ dépend de la prise en charge de l’instruction CPUID par le processeur.
Si l’instruction est prise en charge, la propriété ProcessorId
contient deux valeurs au format DWORD.
- La première (décalages 08h-0Bh) est la valeur EAX renvoyée par une instruction CPUID avec l’entrée EAX définie à 1.
- La deuxième (décalages 0Ch-0Fh) est la valeur EDX renvoyées par cette instruction.
Seuls les deux premiers octets de la propriété ProcessorID
sont significatifs (tous les autres sont définis à 0) et contiennent (au format WORD) le contenu du registre DX à la réinitialisation du processeur.
Win32_PerfFormattedData_Counters_ProcessorInformation
instance of Win32_PerfFormattedData_Counters_ProcessorInformation show{ AverageIdleTime = “3256073”; C1TransitionsPersec = “0”; C2TransitionsPersec = “2398”; C3TransitionsPersec = “0”; ClockInterruptsPersec = 693; DPCRate = 5; DPCsQueuedPersec = 517; IdleBreakEventsPersec = “2414”; InterruptsPersec = 2948; Name = “_Total”; ParkingStatus = 0; PercentC1Time = “0”; PercentC2Time = “96”; PercentC3Time = “0”; PercentDPCTime = “0”; PercentIdleTime = “100”; PercentInterruptTime = “0”; PercentofMaximumFrequency = 93; PercentPerformanceLimit = 100; PercentPriorityTime = “0”; PercentPrivilegedTime = “1”; PercentPrivilegedUtility = “1”; PercentProcessorPerformance = “66”; PercentProcessorTime = “0”; PercentProcessorUtility = “2”; PercentUserTime = “0”; PerformanceLimitFlags = 0; ProcessorFrequency = 3600; ProcessorStateFlags = 0; };
On peut peut être en déduire la charge du CPU en fonction de PercentIdleTime
qui est le pourcentage de temps libre,
donc la charge du CPU devrait être (100-PercentIdleTime
)
On peut peut être en déduire la vitesse du CPU grâce a PercentofMaximumFrequency
.
Qui est censé être le pourcentage de la vitesse max.
Sachant que la vitesse du CPU est fournie par ProcessorFrequency
.
Mais ce ne sont que des suppositions qui mont l'air assez bancales.
En effet le CPU peut dépasser la vitesse fournie par ProcessorFrequency
.
Donc indice de fiabilité faible sur les données récupérées par Win32_PerfFormattedData_Counters_ProcessorInformation
Win32_PerfFormattedData_PerfOS_Processor
- wql sur Root/CIMV2
Select * from Win32_PerfFormattedData_PerfOS_Processor WHERE Name="_Total"
Résultat → instance of Win32_PerfFormattedData_PerfOS_Processor show{ C1TransitionsPersec = “2974”; C2TransitionsPersec = “971”; C3TransitionsPersec = “0”; DPCRate = 2; DPCsQueuedPersec = 403; InterruptsPersec = 5750; Name = “_Total”; PercentC1Time = “13”; PercentC2Time = “30”; PercentC3Time = “0”; PercentDPCTime = “0”; PercentIdleTime = “44”; PercentInterruptTime = “0”; PercentPrivilegedTime = “32”; PercentProcessorTime = “52”; PercentUserTime = “20”; };
root\WMI\ ProcessorPerformance
- wql sur Namespace = Root\WMI\
Select * from ProcessorPerformance
Résultat → instances of ProcessorPerformance showinstance of ProcessorPerformance { Active = TRUE; frequency = 3600; InstanceName = “PPM_Processor_0”; percentage = 48; power = 1; }; instance of ProcessorPerformance { Active = TRUE; frequency = 3600; InstanceName = “PPM_Processor_1”; percentage = 64; power = 1; }; instance of ProcessorPerformance { Active = TRUE; frequency = 3600; InstanceName = “PPM_Processor_2”; percentage = 55; power = 1; }; instance of ProcessorPerformance { Active = TRUE; frequency = 3600; InstanceName = “PPM_Processor_3”; percentage = 56; power = 1; }; instance of ProcessorPerformance { Active = TRUE; frequency = 3600; InstanceName = “PPM_Processor_4”; percentage = 66; power = 1; }; instance of ProcessorPerformance { Active = TRUE; frequency = 3600; InstanceName = “PPM_Processor_5”; percentage = 32; power = 1; }; instance of ProcessorPerformance { Active = TRUE; frequency = 3600; InstanceName = “PPM_Processor_6”; percentage = 47; power = 1; }; instance of ProcessorPerformance { Active = TRUE; frequency = 3600; InstanceName = “PPM_Processor_7”; percentage = 35; power = 1; };
Pas grand chose intéressant a en retirer, mis a part le pourcentage de vitesse pour chaque CPU…
Autres pistes a étudier
- Win32_PerfRawData_Counters_ProcessorInformation
- Win32_PerfFormattedData_Counters_ProcessorInformation
- Win32_PerfRawData_GPUPerformanceCounters_GPUProcessMemory
- Win32_PerfFormattedData_PerfOS_Processor
- Win32_PerfRawData_PerfOS_Processor
- root\WMI\ProcessorBiosTStates
- root\WMI\ProcessorPerformance
- root\WMI\ProcessorBiosInfo
- root\CIMV2\Win32_AssociatedProcessorMemory
Via PDH
Via les API Windows
GetSystemTimes
- jwawinbase.pas
function GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime: LPFILETIME): BOOL; stdcall;
- lpIdleTime :
Un pointeur vers une structure FILETIME qui reçoit la durée d'inactivité du système. - lpKernelTime:
Un pointeur vers une structure FILETIME qui reçoit le temps que le système a passé à s'exécuter en mode noyau (y compris tous les threads de tous les processus, sur tous les processeurs). Cette valeur de temps inclut également la durée d'inactivité du système. - lpUserTime:
Un pointeur vers une structure FILETIME qui reçoit le temps que le système a passé à s'exécuter en mode utilisateur (y compris tous les threads de tous les processus, sur tous les processeurs).