7

当我在本地执行一个简单的语句时

$path = 'C:\Windows\System32\WindowsPowerShell\v1.0'
gci $path

我立即看到了回应。但是当我在本地机器上将它作为作业执行时

$start = get-date
$path = 'C:\Windows\System32\WindowsPowerShell\v1.0'
$cmd = [scriptblock]::Create("gci $path")
$jnr1 = Invoke-Command -computer localhost -ScriptBlock $cmd  -asJob
Wait-Job $jnr1
Receive-job $jnr1
$end = Get-date
($end - $start).totalseconds

我必须等待 55 秒。根据我十年前的 unix 经验。我希望后台作业的运行速度几乎与前台作业一样快。

有没有办法加快 PowerShell 后台作业的执行速度?

4

3 回答 3

4

这个较短的命令做同样的事情:

Measure-Command {Start-Job -Command {gci C:\Windows\System32\WindowsPowerShell\v1.0} | Wait-Job | Receive-Job}

在带 PSv3 的 Win8 beta 上对我来说快了大约 3 秒,在带 PSv2 的 WinXp 上大约是 15-30 秒。

使用 PsV2 引入了后台作业。他们有时间进行优化,因为 v2 和 PowerShell 现在在 v3 中使用DLR,因此可以解释性能差异。

它必须使用命令文本启动另一个 powershell 进程,运行命令,发回序列化结果并拆除该进程。

为了找出它在做什么,我在上面的命令运行时运行了 procmon,并且大部分时间 powershell.exe 都在读取网络和 COM 相关的 reg 键。

于 2012-05-13T20:37:42.570 回答
0

您的演示在我测试的 Windows 服务器上运行得非常快。我相信在这种特殊情况下,工作可能不是问题,而是调用本地主机!尝试将其更改为 127.0.0.1。我遇到了 PHP 应用程序的性能问题,因为解析 localhost 花费了太长时间。将其更改为 ip 地址修复了它。试试看。

相关讨论 https://forums.iis.net/t/1153459.aspx?PHP+very+slow+on+IIS7

于 2020-04-24T11:09:31.927 回答
0

我也遇到了慢速作业的问题,它在前台运行得很快,但是你的问题对于单个命令来说是如此明显,以至于我怀疑这与产生新的 powershell 进程的成本或某些机器特定的困难有关. (是的,您会为每个并发作业获得一个额外的 powershell.exe。)但对于很多人来说,它不仅如此。这篇文章:(https://vwiki.co.uk/Background_Jobs_(PowerShell))提到作业在 PS 中运行的默认优先级低于正常优先级。一些帖子建议在作业代码块中放置以下内容之一,以解决主要的 CPU 问题:

[System.Threading.Thread]::CurrentThread.Priority = 'AboveNormal'
([System.Diagnostics.Process]::GetCurrentProcess()).PriorityClass = 'AboveNormal'

对我来说不幸的是,我认为我遇到了 I/O 性能问题,这与作业的 CPU 性能问题有关。这篇文章:(如何在 Powershell 中设置低 I/O(“后台”)优先级)涉及增加内存和 IO 优先级的概念,但我没有看到一个我觉得很舒服的答案。

Powershell 作业最重要的特性之一是并行执行多个作业。PS Jobs 的替代品是 PS“工作流”,但似乎我仍然遇到与工作相同的工作流性能问题。非常令人沮丧。

于 2016-10-13T22:52:40.537 回答