Я использую конфигурацию желаемого состояния 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 сразу, это должно быть намного быстрее.