我正在使用 powerShell Desired State Configuration 在伺服器電腦上測試/設定 Windows 功能。我擁有 78 個 WindowsFeature 資源,需要時進行檢查和安裝。我觀察到 LCM(本地組態管理員)執行和檢查配置時 CPU 使用率很高。我進行了一些調查,發現 WMI 提供者「deploymentprovider」是負責 WindowsFeature 資源的 ServerManager.DeploymentProvider.dll 的一部分,這是造成這種情況的原因。所以問題是,有人經歷過這個問題並以某種方式解決它嗎?
提前致謝。
答案1
78個WindowsFeature
資源很多了。您可以嘗試透過使用Script
資源並自行編寫程式碼(或建立自訂資源)來合併檢查。花費的大部分 CPU 時間可能都是開銷,因此如果一次檢查所有 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
這是我的程式碼和最終測試結果。 find 範例測試資源的時間大約是原來的 80 倍。因此,值得將資源數量保持在最低水平並處理程式碼中的所有內容。