Назад | Перейти на главную страницу

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

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

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

    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

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

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