对set-webconfigurationproperty
的每次调用都会泄漏相当数量的内存,并最终使当前进程达到MaxMemoryPerShellMb
winrs的限制。
调用set-webconfigurationproperty
+检查循环中当前进程工作集的示例。
所有执行都在使用new-pssession
启动的远程会话中进行,并使用invoke-command
执行。
[remoteserver]: PS C:\scripts> winrm get winrm/config/winrs
Winrs
AllowRemoteShellAccess = true
IdleTimeout = 7200000
MaxConcurrentUsers = 10
MaxShellRunTime = 2147483647
MaxProcessesPerShell = 25
MaxMemoryPerShellMB = 1024
MaxShellsPerUser = 30
[remoteserver]: PS C:\scripts>
1..100 | %{
Set-WebConfigurationProperty -PSPath IIS:\ -filter "/system.webserver/rewrite/rewriteMaps/rewriteMap[@name='HostNameToServerMap']/add[@key='www.adomain.com']" -name "value" -value "iis04"
new-object psobject -property @{ WorkingSet = "{0:f2} MB" -f ([System.Diagnostics.Process]::GetCurrentProcess().WorkingSet/1mb); Timestamp = get-date }
}
Timestamp WorkingSet
--------- ----------
2014-10-14 22:10:54 964,45 MB
2014-10-14 22:10:56 981,76 MB
2014-10-14 22:10:57 999,95 MB
2014-10-14 22:10:58 1018,86 MB
Set-WebConfigurationProperty : Not enough storage is available to process this command. (Exception from HRESULT: 0x8007
0008)
At line:2 char:1
+ Set-WebConfigurationProperty -PSPath IIS:\ -filter "/system.webserver/rewrite/re ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Set-WebConfigurationProperty], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.IIs.PowerShell.Provider.SetConfigu
rationPropertyCommand
2014-10-14 22:10:59 289,46 MB
2014-10-14 22:11:01 216,45 MB
2014-10-14 22:11:02 230,79 MB
2014-10-14 22:11:03 246,11 MB
2014-10-14 22:11:04 263,13 MB
2014-10-14 22:11:05 280,54 MB
2014-10-14 22:11:07 296,83 MB
2014-10-14 22:11:08 313,14 MB
2014-10-14 22:11:09 330,62 MB
2014-10-14 22:11:10 347,47 MB
2014-10-14 22:11:11 365,27 MB
....
set-webconfigurationproperty
消耗的内存未被释放。
当进程达到WinRS shell的限制时(我的示例中为1024 Mb),会发生错误。
此错误已存在多年,现在我已在Server 2012 R2上重现它,因此IIS 7,7.5,8和8.5都受到影响。
是否有更好的方法(批量)更新IIS配置,而不是在WinRM会话中使用{1}} WebAdministration PowerShell模块?
答案 0 :(得分:1)
如果您使用的是IIS 7或IIS 8,则可以使用名为Microsoft.Web.Administration的新托管API。
您可以在Visual Studio中通过NuGet获取此包。
以下是C#中的示例代码,可以批量更新配置。
您可以将此Console程序升级到您的服务器并运行它。
有关详细信息,请阅读以下文章:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;
namespace IISManager
{
class Program
{
static void Main(string[] args)
{
ServerManager serverManager = new ServerManager();
foreach (Site site in serverManager.Sites)
{
Console.WriteLine(site.Name);
Configuration config = site.GetWebConfiguration();
ConfigurationSection section = config.GetSection("system.webServer/samplesetion");
ConfigurationAttribute enabled = section.GetAttribute("enabled");
enabled.Value = true;
serverManager.CommitChanges();
Console.Read();
}
}
}
}
使用C#管理IIS - Microsoft.Web.Administration命名空间
http://msdn.microsoft.com/en-us/library/microsoft.web.administration(v=vs.90).aspx
Programmatically create a web site in IIS using C# and set port number
最好的问候。
ADAMUS