Высокая загрузка ЦП наблюдается у поставщика WMI "deploymentprovider", который является частью ServerManager.DeploymentProvider.dll

Высокая загрузка ЦП наблюдается у поставщика WMI "deploymentprovider", который является частью ServerManager.DeploymentProvider.dll

Я использую PowerShell Desired State Configuration для тестирования/настройки компонентов Windows на серверной машине. У меня есть 78 ресурсов WindowsFeature, которые нужно проверить и установить при необходимости. Я заметил высокую загрузку ЦП, пока LCM (Local Configuration Manager) выполняет и проверяет конфигурацию. Я немного поисследовал и выяснил, что причиной этого является поставщик WMI "deploymentprovider", который является частью ServerManager.DeploymentProvider.dll, отвечающей за ресурс WindowsFeature. Поэтому вопрос в том, сталкивался ли кто-нибудь с этой проблемой и как-то ее решил?

Заранее спасибо.

решение1

78 WindowsFeatureресурсов — это много. Вы можете попробовать объединить проверки, используя Scriptресурс и написав код самостоятельно (или создав пользовательский ресурс). Большая часть времени ЦП, вероятно, тратится на накладные расходы, поэтому если вы проверите все 78 сразу, это должно быть намного быстрее.

решение2

    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

Вот мой код и результаты финального теста. Пример поиска тратит ~80 раз больше времени на тестирование ресурсов. Поэтому стоит ограничить количество ресурсов до минимального уровня и обрабатывать все внутри вашего кода.

Связанный контент