【问题标题】:How to speed up startup of Powershell in the 4.0 environment?4.0环境下如何加快Powershell的启动速度?
【发布时间】:2022-03-05 17:16:54
【问题描述】:

我正在考虑在我们的 Perforce 服务器上使用 Powershell 脚本作为触发器。不幸的是,即使在我们快速的硬件上,Powershell 仍然需要 2 秒才能启动。现在,除非您考虑到 200 个用户不断地冲击服务器,并且触发器可能(取决于条件)在运行时导致表锁定,从而停止其他相关请求,否则这似乎不是很长的时间。

我正在寻找减少 Powershell 启动时间的方法。我在 Google 上找到的东西:

  • 减少配置文件。这是默认安装,没有配置文件自定义,没有 PSCX 等,所以这没有帮助。
  • 在 Posh 二进制文件上运行 NGEN。 这是针对 V1 问题的旧建议。我们正在使用 V2。
  • 保持温暖。 Posh 最初的启动速度很慢,但后来的启动速度很快。对我们也没有帮助。在服务器上,热启动为 2 秒,并通过频繁的请求保持温暖。
  • 不要为此目的使用 Powershell。 好吧,我希望避免这种“解决方案”......

还有其他关于缩短启动时间的建议吗?我不希望启动像 cmd.exe 或 .NET 命令行应用程序那样快,但如果我能把它缩短到 0.5 秒,我想我们会没事的。不可能?

更新 - 事实证明这是一个 4.0 问题。如果我按照another SO question 中的描述添加配置文件,则启动需要 2 秒。如果我将其保留为默认值,则启动时间不到四分之一秒。

然后我想..也许这是一个 4.0 GAC 问题。所以我在PowerShell Blog 上运行了脚本,但它说所有程序集都已经ngen'd。我确定它确实也在使用 4.0 ngen。

所以我有两个选择:

  • 弄清楚为什么 4.0 比 3.5 贵这么多。
  • 切换到我不需要它但我确实需要性能的 3.5 框架。

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

【问题讨论】:

    标签: performance powershell


    【解决方案1】:

    在 Posh 二进制文件上运行 NGEN。这是针对 V1 问题的旧建议。我们在 V2 上。

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

    而且确实感觉现在启动速度要快得多。之后我会知道的更好 重启,因为第一次总是最糟糕的。 (我更新的)脚本这样做 与 Win 7 是

    $env:path = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
    [AppDomain]::CurrentDomain.GetAssemblies() | % {
      if (! $_.location) {continue}
      $Name = Split-Path $_.location -leaf
      Write-Host -ForegroundColor Yellow "NGENing : $Name"
      ngen install $_.location | % {"`t$_"}
    }
    

    【讨论】:

    • 我观察到,全新安装 Windows 8.1 后,此建议适用并将 Powershell 启动时间减少约 10 倍(如果存在空配置文件)。
    【解决方案2】:

    在对my question on Technet 的出色回答之后,我发现了一种更简单的手动触发 NGEN 的方法(因为它似乎不会在全新安装的 Windows 8.1 上自动发生):

    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"
    

    【讨论】:

      【解决方案3】:

      如果您坚持使用控制台主机 powershell.exe,恐怕您可能不走运,除非您想通过在自定义控制台应用程序或 Windows 服务中托管运行空间/运行空间工厂来编写优化的脚本处理器- 你自己滚。您可能会减少一秒钟的时间,但 .NET 应用程序不太可能启动 0.5 秒,尤其是在服务器内存紧张的情况下。

      【讨论】:

      • 好的,我发现这是 4.0 的问题。更新的问题。
      • 呃。您要强制 powershell v2.0 在 v4 框架上运行吗?它不是为此而设计的。我希望我有更多的细节......你有 dotTrace 或 ANTS 分析器来找出瓶颈在哪里?
      • 如果您仔细阅读那篇 SO 文章,您会发现它是关于在托管 4.0 环境中托管 System.Management.Automation.dll 的。就像那家伙说的,控制台主机(powershell.exe)没有针对 4.0 进行优化——事实上,powershell.exe 甚至不是托管应用程序——它是本机的。它承载 CLR。​​
      • 不支持?哦。好吧,Powershell 2 为我们运行 v4,到目前为止我没有看到任何问题。只是启动延迟问题。 SO 文章讨论了托管 Powershell 的 4.0 应用程序以及使用 4.0 程序集的 Powershell 本身。我可以尝试使用 .net 分析器对其进行分析,但我认为这不会给我任何我可以采取的行动。出于好奇,无论如何都可以尝试一下。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多