Hohe CPU-Auslastung beim WMI-Provider „Deploymentprovider“, der Teil von ServerManager.DeploymentProvider.dll ist

Hohe CPU-Auslastung beim WMI-Provider „Deploymentprovider“, der Teil von ServerManager.DeploymentProvider.dll ist

Ich verwende die Desired State Configuration von powerShell, um Windows-Funktionen auf einem Servercomputer zu testen/einzustellen. Ich habe 78 WindowsFeature-Ressourcen, die überprüft und bei Bedarf installiert werden müssen. Was mir aufgefallen ist, ist eine hohe CPU-Auslastung, während LCM (Local Configuration Manager) ausgeführt wird und die Konfiguration überprüft. Ich habe ein wenig nachgeforscht und herausgefunden, dass der WMI-Anbieter „Deploymentprovider“, der Teil von ServerManager.DeploymentProvider.dll ist, der für die WindowsFeature-Ressource verantwortlich ist, die Ursache dafür ist. Die Frage ist also, hat jemand dieses Problem erlebt und es irgendwie gelöst?

Dank im Voraus.

Antwort1

78 WindowsFeatureRessourcen sind eine Menge. Sie könnten versuchen, die Prüfungen zu konsolidieren, indem Sie eine ScriptRessource verwenden und den Code selbst schreiben (oder eine benutzerdefinierte Ressource erstellen). Der Großteil der aufgewendeten CPU-Zeit ist wahrscheinlich Overhead, wenn Sie also alle 78 auf einmal prüfen, sollte es viel schneller gehen.

Antwort2

    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

Hier ist mein Code und die endgültigen Testergebnisse. Das Suchbeispiel benötigt ungefähr 80-mal länger, um Ressourcen zu testen. Es lohnt sich also, die Anzahl der Ressourcen auf ein Minimum zu beschränken und alles innerhalb des Codes zu handhaben.

verwandte Informationen