PowerShellの必要な状態の構成を使用して、サーバーマシンでWindowsの機能をテスト/設定しています。私が持っているのは、必要に応じてチェックしてインストールする78のWindowsFeatureリソースです。私が観察したのは、LCM(Local Configuration Manager)の実行中および構成のチェック中にCPU使用率が高いことです。少し調べてみたところ、WindowsFeatureリソースを担当するServerManager.DeploymentProvider.dllの一部であるWMIプロバイダー "deploymentprovider"が原因であることがわかりました。だから問題は、誰かがこの問題を経験し、何らかの方法でそれを解決したことがあるかということです。
前もって感謝します。
78 WindowsFeature
リソースはたくさんあります。 Script
リソースを使用し、自分でコードを作成する(またはカスタムリソースを作成する)ことで、チェックを統合してみることができます。費やされるCPU時間のほとんどはおそらくオーバーヘッドであるため、78個すべてを一度にチェックすると、はるかに高速になるはずです。
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
これが私のコードと最終的なテスト結果です。検索の例では、リソースのテストに約80倍の時間がかかります。したがって、リソースの数を最小限に抑え、コード内のすべてを処理することは価値があります。