进程作为计划任务运行速度慢于交互式运行

我有一个计划任务,这是非常CPU和IO密集型,大约需要四个小时运行(如果你好奇,build设源代码)。 任务是一个Powershell脚本,它产生各种子stream程来完成它的工作。 当我从Powershell提示符以交互方式运行相同的进程时,它以相同的用户帐户运行大约两个半小时。 该任务正在Windows Server 2008 R2上运行。

我想知道的是为什么需要更长的时间才能按预定的任务运行 – 超过一个小时的时间。 我注意到的一件事是任务调度程序以低于正常优先级运行,所以当我的任务开始时,它inheritance了相同的降低的优先级。 不过,我已经更新了脚本来将Powershell进程的优先级恢复到正常状态,而且这个过程仍然需要很长时间。

任何人都有一个想法,这两种情况下可能会有什么不同? 我已经排除了处理器和IO负载方面的差异 – 这个任务是系统唯一使用的,所以没有别的可以竞争资源的运行。

看来在这里工作的不仅仅是“正规”的stream程优先级。 正如我在问题中指出的,默认情况下,任务调度程序以低于正常优先级的方式运行您的任务。 StackOverflow上的这个问题描述了如何修复任何以普通优先级运行的任务,但修复仍然会使一件事情略有不同:内存优先级。 内存优先级是Windows Vista的一项新function,在本Technet文章中有描述。 您可以使用Process Explorer查看内存优先级,这是任何pipe理员或程序员必备的工具。

无论如何,即使计划任务优先级修复,您的任务的内存优先级设置为4,这是正常设置5以下一个档次。当我手动提高我的任务的内存优先级达到5,性能是与交互式运行过程相提并论。

有关提高优先级的信息,请参阅我对有关IO优先级的相关StackOverflow问题的回答 ; 通过NtSetInformationProcess设置内存优先级, PROCESS_INFORMATION_CLASS设置为ProcessMemoryPriority (值为39或0x27)。 我可能会创build一个免费的实用程序,可以用来设置,如果其他人需要它,并没有访问程序员工具。

编辑:我已经提前写了一个免费的工具来查询和设置任务的内存优先级, 可在这里 。 下载包含源代码和一个编译的二进制文件。

问题是你的进程开始于低I / O优先级和低内存优先级。 validation这个最简单的方法是使用sysinternals的进程pipe理器。 如果您查看从此计划任务派生的任何进程的属性,则会看到它具有低优先级和2的内存优先级的I / O优先级。

这是解决这个问题的方法:

  1. 创build任务
  2. 右键单击任务并“导出”它
  3. 编辑刚刚导出的task.xml文件
  4. 您将find类似于<Priority>7</Priority>
  5. 将该值更改为正常优先级(4-6之间)。 潜在值的表格: TaskSettings.Priority属性
    • 值为4将具有与交互式进程相同的I / O和内存优先级。 5和6的值将具有较低的内存优先级
  6. 在任务计划程序中,删除最初创build的任务
  7. 在任务计划程序的“操作”区域中,从XML文件导入任务

不幸的是,没有办法从GUI修改计划任务的初始优先级。

如果您将其设置为按照用户X的计划任务运行,然后在应该运行之前以用户X的身份login,则会在运行时在会话中打开一个窗口,该窗口将在您的会话中运行。

如果你这样做,是否需要更长或更短的时间? 我不知道这会是什么意思,但它可能是一个有用的区别。 用户帐户login时是否可以访问某些networking访问权限,但是如果按计划的任务运行,则需要超时并失败? 如果您创build一个新的用户帐户并使其作为该帐户下的计划任务运行,则行为是否有所不同?

另一个想法:当它作为一个计划任务运行 – 现在你已经修复了脚本的优先级,subprocess都运行正常,或低于正常?

也许计划的任务默认情况下以较低的优先级运行。

使用prio强制更高的优先级。

起初 – 你可以使用超过正常的优先级(例如高)

在第二个 – 你必须明白,比前台会话需要一些资源,主要是硬盘IO和内存如此计划的任务得到较less。 为明确的基准,你必须注销,而你的PowerShell脚本运行

也可以尝试在多个硬盘上添加更多内存/使用ramdrive / split工作来加速进程