Performance 如何在4.0环境中加速Powershell的启动?

Performance 如何在4.0环境中加速Powershell的启动?,performance,powershell,Performance,Powershell,我正在考虑在Performce服务器上使用Powershell脚本作为触发器。不幸的是,即使在我们的快速硬件上,Powershell也需要2秒钟才能启动。现在,这似乎不是很长的时间,除非你认为200个用户不断地对服务器进行敲击,并且触发器可能(取决于条件)在运行时导致表锁定,拖延其他相关请求。 我正在寻找缩短Powershell启动时间的方法。我在谷歌上找到的东西: 缩小轮廓。这是一个默认安装,没有配置文件自定义,没有PSCX等,所以这没有帮助 在高级二进制文件上运行NGEN。这是关于V1问题

我正在考虑在Performce服务器上使用Powershell脚本作为触发器。不幸的是,即使在我们的快速硬件上,Powershell也需要2秒钟才能启动。现在,这似乎不是很长的时间,除非你认为200个用户不断地对服务器进行敲击,并且触发器可能(取决于条件)在运行时导致表锁定,拖延其他相关请求。 我正在寻找缩短Powershell启动时间的方法。我在谷歌上找到的东西:

  • 缩小轮廓。这是一个默认安装,没有配置文件自定义,没有PSCX等,所以这没有帮助
  • 在高级二进制文件上运行NGEN。这是关于V1问题的老建议。我们在V2上
  • 保持温暖。最初的豪华创业很慢,但后来的创业很快。对我们也没有帮助。在服务器上,热启动时间为2秒,并通过频繁请求保持热启动
  • 不要为此目的使用Powershell。嗯,我希望避免那种“解决方案”
有人对缩短启动时间有其他建议吗?我不希望启动的速度像cmd.exe或.NET命令行应用程序那样快,但如果我能让它达到.5秒,我想我们就可以了。不可能

更新-原来这是一个4.0版本。如果按照启动中所述添加配置文件,则需要2秒钟。如果我让它保持默认状态,那么启动时间不到四分之一秒

然后我想…也许这是4.0版的GAC。所以我在上运行了脚本,但是它说所有的程序集都已经被加密了。我确保它确实也在使用4.0 ngen

所以我有两个选择:

  • 找出为什么4.0比3.5贵得多
  • 切换到3.5框架,在那里我不需要它,我需要性能

我很想解决第一个问题,但不知道从哪里开始。有人能帮忙吗?

如果您坚持使用控制台主机powershell.exe,恐怕您会运气不佳,除非您想通过在自定义控制台应用程序(或windows服务)中托管运行空间/运行空间工厂来编写优化的脚本处理器,否则您可以自行启动。您可以节省一秒钟,但是.NET应用程序不太可能启动0.5s,特别是在服务器内存紧张的情况下

在高级二进制文件上运行NGEN。这是关于V1问题的老建议。我们在V2上

我一直在V3下玩这个,我发现有些图像 生成

当然,现在的创业速度要快得多。过一段时间我会知道的 重新启动,因为第一次总是最糟糕的。执行此操作的(我更新的)脚本 赢了7分就是

$env:path=[Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
[AppDomain]::CurrentDomain.GetAssemblys()|%{
如果(!$\位置){继续}
$Name=拆分路径$\位置-叶
写入主机-ForegroundColor黄色“NGENing:$Name”
ngen安装$|.location |%{`t$"
}

根据对的出色回答,我发现了一种更简单的手动触发NGEN的方法(因为在干净的Windows 8.1安装中似乎不会自动触发):


好吧,我发现这是一个4.0版本。更新的问题。您正在强制powershell v2.0在v4框架上运行?它不是为了这样设计的。我希望我有更多的细节。。。你有dotTrace或ANTS profiler来找出瓶颈在哪里吗?如果你仔细阅读这篇文章,你会发现它是关于托管托管4.0环境中的System.Management.Automation.dll的。正如这家伙所说,控制台主机(powershell.exe)没有针对4.0进行优化-事实上,powershell.exe甚至不是托管应用程序-它是本机的。它承载CLR。不支持它吗?哦好吧,Powershell 2为我们使用v4运行,到目前为止我还没有看到任何问题。只是启动延迟问题。本文还讨论了托管Powershell的4.0应用程序,以及使用4.0程序集的Powershell本身。我可以试着用.net分析器来分析它,但我认为这不会给我任何可以采取行动的东西。。出于好奇,我可能会尝试一下。我观察到,在干净安装Windows 8.1的情况下,此建议适用,并将Powershell启动时间减少了约10倍(如果存在空配置文件)。
schtasks /Run /TN "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319"
schtasks /Run /TN "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64"