为什么Powershell Jobs这么慢?

时间:2012-05-13 17:27:21

标签: powershell jobs

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

$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后台作业的执行?

3 个答案:

答案 0 :(得分:4)

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

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

在Win8 beta w / PSv3上它对我来说快〜3秒,在WinXp w / PSv2上它是~15-30秒。

后台工作是与PsV2一起引入的。他们有时间进行优化,因为v2和PowerShell现在使用v3中的DLR,这可以解释性能上的差异。

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

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

答案 1 :(得分: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性能问题相反。这篇文章:(How to set Low I/O ("background") priority in Powershell)涉及增加内存和IO优先级的概念,但我没有看到一个我觉得很容易实现的答案。

Powershell作业最重要的功能之一是并行执行多个作业。 PS Jobs的另一种选择是PS" Workflows",但似乎我仍然遇到与工作流程相同的工作流程性能问题。非常令人沮丧。

答案 2 :(得分:0)

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

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