Alto uso de CPU observado do provedor WMI "deploymentprovider", que faz parte do arquivo ServerManager.DeploymentProvider.dll

2

Estou usando a Configuração de estado desejado do powerShell para testar / definir os recursos do Windows na máquina do servidor. O que eu tenho é 78 recursos do WindowsFeature a serem verificados e instalados, se necessário. O que eu observei é o alto uso de CPU enquanto o LCM (Local Configuration Manager) está executando e verificando a configuração. Eu investiguei um pouco e descobri que o provedor WMI "deploymentprovider", que é uma parte do ServerManager.DeploymentProvider.dll responsável pelo recurso WindowsFeature é causa disso. Então a questão é, alguém já experimentou esse problema e resolveu de alguma forma?

Obrigado antecipadamente.

    
por Juris Krumins 13.10.2015 / 11:05

2 respostas

0

78 WindowsFeature resources é muito. Você poderia tentar consolidar as verificações usando um recurso Script e escrever o código sozinho (ou criar um recurso personalizado). A maior parte do tempo gasto na CPU é provavelmente de sobrecarga, portanto, se você marcar todos os 78 de uma só vez, isso deve ser muito mais rápido.

    
por 14.10.2015 / 17:08
1
    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

Aqui está o meu código e os resultados finais do teste. O exemplo de localização leva ~ 80 vezes mais tempo para testar recursos. Então vale a pena manter o número de recursos no nível mínimo e lidar com tudo dentro do seu código.

    
por 16.10.2015 / 14:41