Alto uso de CPU observado por el proveedor WMI "deploymentprovider", que forma parte de ServerManager.DeploymentProvider.dll

Alto uso de CPU observado por el proveedor WMI "deploymentprovider", que forma parte de ServerManager.DeploymentProvider.dll

Estoy usando PowerShell Desired State Configuration para probar/configurar las funciones de Windows en la máquina del servidor. Lo que tengo son 78 recursos de WindowsFeature para verificar e instalar si es necesario. Lo que observé es un uso elevado de la CPU mientras LCM (Administrador de configuración local) ejecuta y verifica la configuración. Investigué un poco y descubrí que el proveedor WMI "deploymentprovider", que es parte de ServerManager.DeploymentProvider.dll responsable del recurso WindowsFeature, es la causa. Entonces la pregunta es, ¿alguien ha experimentado este problema y lo ha resuelto de alguna manera?

Gracias de antemano.

Respuesta1

78 WindowsFeaturerecursos es mucho. Puede intentar consolidar las comprobaciones utilizando un Scriptrecurso y escribiendo el código usted mismo (o creando un recurso personalizado). La mayor parte del tiempo de CPU invertido probablemente sea una sobrecarga, por lo que si verifica los 78 a la vez, debería ser mucho más rápido.

Respuesta2

    Configuration cWindowsFeatures {
        param
        (
            [parameter(Mandatory=$true)]
            $WindowsFeatures

        )
        Import-DscResource -ModuleName PSDesiredStateConfiguration
        $i=0
        foreach($WindowsFeature in $WindowsFeatures.keys)
        {
            $ResourceName="WindowsFeature$($i)"
            WindowsFeature "$ResourceName"
            {
                Name = "$WindowsFeature"
                Ensure = $WindowsFeatures["$WindowsFeature"][0]
                IncludeAllSubFeature = $WindowsFeatures["$WindowsFeature"][1]
            }
            $i++
        }
}


function Get-TargetResource 
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param 
    (      
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Id,
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $WindowsFeature
    )

    $retValue=@{}
    $InstalledFeatures=(Get-WindowsFeature -Name $WindowsFeature | Where-Object {$_.InstallState -eq "Installed"}).Name
    $retValue.WindowsFeature=$InstalledFeatures
    return $retValue
}


function Set-TargetResource 
{
    [CmdletBinding()]
    param 
    (      
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Id,
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $WindowsFeature
    )

    Install-WindowsFeature -Name $WindowsFeature

}

# The Test-TargetResource cmdlet is used to validate if the role or feature is in a state as expected in the instance document.
function Test-TargetResource 
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param 
    (      
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Id,
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $WindowsFeature
    )

    $return=$false
    $InstalledFeatures=(Get-TargetResource -Id $Id -WindowsFeature $WindowsFeature).WindowsFeature
    if($InstalledFeatures.Count -eq $WindowsFeature.Count)
    {
        Write-Verbose -Message "Seems like all features are already installed"
        $return=$true
    }
    else
    {
        Write-Verbose -Message "Some features are still missing. It'll be necessary to installed them."
    }
    return $return

}


Export-ModuleMember -function Get-TargetResource, Set-TargetResource, Test-TargetResource




Configuration app0 { 
    param (
            [parameter(Mandatory=$true)]
            [string]$MachineName
           )

    Import-DscResource -ModuleNAme cCompositeConfigurationResources
    Import-DscResource -ModuleName cPSDesiredStateConfiguration

    Node $AllNodes.Where{$_.Nodename -eq "$MachineName"}.Nodename {
        #region WindowsFeatures
        cWindowsFeatures cWindowsFeatures0
        {
            WindowsFeatures=$Node.WindowsFeatures
        }
        #endregion WindowsFeatures
    }
}


Configuration app1 { 
    param (
            [parameter(Mandatory=$true)]
            [string]$MachineName
           )

    Import-DscResource -ModuleName cPSDesiredStateConfiguration

    Node $AllNodes.Where{$_.Nodename -eq "$MachineName"}.Nodename {
        #region WindowsFeatures
        cWindowsFeature cWindowsFeature0
        {
            ID = "cWindowsFeature0"
            WindowsFeature=$Node.WindowsFeatures.Keys
        }
        #endregion WindowsFeatures
    }
}

app0 -ConfigurationData $ConfigurationData -OutputPath C:\DSC0 -MachineName app1
app1 -ConfigurationData $ConfigurationData -OutputPath C:\DSC1 -MachineName app1

Start-DSCConfiguration -Path c:\dsc0 -Wait -Force
Start-Sleep 1
Start-DSCConfiguration  -Wait -Force -UseExisting
(Get-DSCConfigurationStatus).DurationInSeconds
Start-DSCConfiguration -Path c:\dsc1 -Wait -Force
Start-Sleep 1
Start-DSCConfiguration  -Wait -Force -UseExisting
(Get-DSCConfigurationStatus).DurationInSeconds



    Directory: C:\DSC0


Mode                LastWriteTime         Length Name                                                                                                                                                                          
----                -------------         ------ ----                                                                                                                                                                          
-a----       10/16/2015   2:23 PM          76182 app1.mof                                                                                                                                                                      


    Directory: C:\DSC1


Mode                LastWriteTime         Length Name                                                                                                                                                                          
----                -------------         ------ ----                                                                                                                                                                          
-a----       10/16/2015   2:23 PM           5152 app1.mof                                                                                                                                                                      
14
0

Aquí está mi código y los resultados finales de la prueba. El ejemplo de búsqueda tarda aproximadamente 80 veces más en probar los recursos. Por lo tanto, vale la pena mantener la cantidad de recursos al nivel mínimo y manejar todo dentro de su código.

información relacionada