为什么PowerShell作业如此缓慢?

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秒。基于我10年前的Unix经验,我认为后台作业应该和前台作业运行速度几乎一样。

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


在我的电脑上启动PowerShell窗口需要很长时间。但是一旦加载完成,运行命令就非常快了。可能是cron先加载了PowerShell,因此会有延迟。 - Shiplu Mokaddim
PowerShell_ISE 在大约 10 秒钟内启动,而 PowerShell 则在不到 3 秒钟内启动。肯定还有其他原因。 - bernd_k
我已经在XP sp3、Windows 7 pro和Windows server 2008 R2上测试了您的脚本,始终使用powershell 2.0,并且经过的时间分别为:约6秒、约5秒、约4秒。 - CB.
3个回答

4

这个更短的命令执行相同的操作:

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

在Win8 beta上使用PSv3,我觉得速度很快,大约3秒钟;而在WinXP上使用PSv2,则需要15-30秒。
后台作业是在PsV2中引入的。自从v2以来,他们已经有时间进行了优化,现在PowerShell在v3中使用DLR,这可能解释了性能差异。
它必须启动另一个包含命令文本的PowerShell进程,运行命令,发送序列化结果并关闭进程。
为了找出它正在做什么,我在上述命令运行时运行了procmon,并且大部分时间powershell.exe都在读取与网络和COM相关的注册表键。

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“工作流”,但似乎我仍然遇到与作业相同的性能问题。非常令人沮丧。


0

我在测试的Windows服务器上发现你的演示速度非常快。我认为在这种情况下,问题可能不是作业,而是调用本地主机!尝试将其更改为127.0.0.1。我曾经因为PHP应用程序的性能问题而遇到过问题,因为它花费了太长时间来解析本地主机。将其更改为IP地址可以解决此问题。试试吧。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接