为什么Powershell作业如此缓慢?
当我在本地执行简单的陈述时
$path = 'C:WindowsSystem32WindowsPowerShellv1.0'
gci $path
我立即看到了答复。 但是当我在本地机器上执行它作为工作时
$start = get-date
$path = 'C:WindowsSystem32WindowsPowerShellv1.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后台作业的执行?
这个较短的命令做同样的事情:
Measure-Command {Start-Job -Command {gci C:WindowsSystem32WindowsPowerShellv1.0} | Wait-Job | Receive-Job}
在Win8 beta w / PSv3上它对我来说很快〜3秒,在WinXp w / PSv2上它是〜15-30秒。
背景工作是在Ps / 2引入的。 从v2开始,他们有时间进行优化,现在PowerShell现在在v3中使用DLR,以便可以解释性能差异。
它必须使用命令文本启动另一个PowerShell进程,运行命令,发回序列化结果并拆除进程。
为了找出它在做什么,我跑了procmon,而上面的命令正在运行,并且大部分时间powershell.exe正在读取网络和COM相关的注册表项。
我在前台运行速度很慢的时候遇到了一些问题,但是您的问题对于单个命令来说非常明显,以至于我怀疑这些问题与产生新的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作业的另一种选择是PS“工作流程”,但似乎我仍对工作流程具有与作业相同的性能问题。 非常令人沮丧。
链接地址: http://www.djcxy.com/p/59471.html