Estou usando o PowerShell Desired State Configuration para testar/definir recursos do Windows na máquina do servidor. O que tenho são 78 recursos do WindowsFeature para serem verificados e instalados, se necessário. O que observei é 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 faz parte do ServerManager.DeploymentProvider.dll responsável pelo recurso WindowsFeature, é a causa disso. Então a questão é: alguém já passou por esse problema e resolveu de alguma forma?
Desde já, obrigado.
Responder1
78 WindowsFeature
recursos é muito. Você poderia tentar consolidar as verificações usando um Script
recurso e escrevendo o código você mesmo (ou criando um recurso personalizado). A maior parte do tempo de CPU gasto provavelmente é sobrecarga, portanto, se você verificar todos os 78 de uma vez, deverá ser muito mais rápido.
Responder2
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á meu código e os resultados finais do teste. O exemplo de localização leva cerca de 80 vezes mais para testar recursos. Portanto, vale a pena manter o número de recursos no nível mínimo e lidar com tudo dentro do seu código.