WMI - ALERTE performance : la classe Win32_OperatingSystem !

ALERTE performance : la classe Win32_OperatingSystem !

La classe WMI Win32_OperatingSystem est très populaire (à juste titre) chez les administrateurs système. Elle est fréquemment utilisée par exemple pour exécuter des actions spécifiques ou appliquer des stratégies de groupes (GPO) spécifiques à une version de Windows.

Cette classe (cf https://msdn.microsoft.com/en-us/library/aa394239(v=vs.85).aspx ) semble bien anodine et ne « collecte » que des « informations statiques » .

C’est sans compter avec le champ NumberOfProcesses !

NumberOfProcesses

Data type: uint32

Access type: Read-only

Number of process contexts currently loaded or running on the operating system.

 

 

Pour déterminer la valeur de NumberOfProcesses, le provider WMI fait lui-même une requête WMI « SELECT __RELPATH FROM Win32_Process » qui charge considérablement le système.

Par exemple sur un « large serveur » RDS/Citrix avec :

  • Plusieurs GPOs ayant un filtre du type :Select * FROM Win32_OperatingSystem WHERE Version like '6.3%'

  • De scripts de logon avec des « select * Win32_OperatingSystem »

  • Des « brokers » ou des outils de monitoring exécutant des « Select * from Win32_Process »

  • De nombreux « logon »

Vous observerez rapidement :

  • une forte consommation CPU dans le process WMIPRVSE

  • des temps de « logon » important

  • une forte contention « kernel »  liée à l’énumération des processus qui peut avoir des conséquences diverses et variées (lenteur lors du lancement du gestionnaire de tâches,…)

La solution est de limiter les champs retournés par la requête WQL. Le provider de la classe Win32_OperatingSystem ne collecte alors que les infos demandées. La requête « select Version from Win32_OperatingSystem » n’énumère pas la liste des processus.

Tip :

L’activation du tracing « WMI-Activity » (https://msdn.microsoft.com/en-us/library/aa826686(v=vs.85).aspx) permet d’identifier ce type de problème.

[10/17 03:46:47.0051 PM] [wbemtest.exe] [201c.1f84] ExecQuery: select * from win32_operatingsystem

[10/17 03:46:47.0401 PM] [wmiprvse.exe] [12a0.15d4] ExecQuery: references of {__Win32Provider.Name="CIMWin32"}

[10/17 03:46:47.0578 PM] [wmiprvse.exe] [12a0.15d4] ExecQuery: SELECT __RELPATH FROM Win32_Process