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


41

我有一个计划的任务,这是非常占用CPU和IO的工作,大约需要四个小时才能运行(如果您好奇的话,可以构建源代码)。该任务是一个Powershell脚本,它生成各种子流程来完成其工作。当我从Powershell提示符以相同的用户帐户交互运行相同的进程时,它运行大约两个半小时。该任务正在Windows Server 2008 R2上运行。

我想知道的是,为什么要花这么多的时间来执行计划任务-超过一个小时。我注意到的一件事是,任务计划程序以低于正常的优先级运行,因此当我的任务启动时,它会继承相同的降低的优先级。但是,我已经更新了脚本,以将Powershell进程优先级设置回“正常”,并且仍然需要花费同样长的时间。

任何人都知道这两种情况之间可能有什么不同?我已经排除了处理器和IO负载之间的差异-该任务是系统用于的唯一任务,因此,没有其他正在竞争资源的事情了。


任何更新?我很想知道您能找到什么。
mfinni 2010年

我确实找到了我认为的原因;请参阅下面的答案。
查理

从Windows 10 Fall Creators开始,此问题仍然存在,@ Jason Mathison的解决方法(编辑Task Scheduler .xml文件)仍然是最佳解决方案。
BSalita

Answers:


36

似乎在这里工作不仅仅是“常规”流程优先级。正如我在问题中指出的那样,默认情况下,任务计划程序以低于正常优先级的速度运行任务。关于StackOverflow的此问题描述了如何修复以“正常”优先级运行的任何任务,但此修复仍使事情稍有不同:内存优先级。内存优先级是Windows Vista的一项新功能,在Technet文章对此进行了介绍。您可以使用Process Explorer看到内存优先级,Process Explorer是任何管理员或程序员必备的工具。

无论如何,即使使用预定的任务优先级修复程序,您的任务的内存优先级也被设置为4,比正常设置5低了一个档位。当我手动将任务的内存优先级提高到5时,性能得以提高。与以交互方式运行该流程相当。

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

编辑:我已经着手编写了一个免费的实用程序,用于查询和设置任务的内存优先级,可在此处获得。下载内容包含源代码和已编译的二进制文件。


通过双击可执行文件的名称,打开“性能”选项卡,可以在Process Explorer中查看内存优先级,并且在“物理内存”下是“内存优先级”的条目
Moshe

17

问题是您的进程从低I / O优先级和低内存优先级开始。验证这一点最简单的方法是使用sysinternals的流程浏览器。如果查看从此计划任务派生的任何进程的属性,您将看到它的I / O优先级为低,内存优先级为2。

这是此问题的解决方案:

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

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


谢谢你的建议。常规进程优先级和IO优先级无疑是其中的一部分,另一部分是内存优先级。有关更多信息,请参见接受的答案。
查理

将任务导出到XML文件后,您可能需要将字符编码从Unicode更改为ANSI。在Windows Server 2008 R2上,导出是Unicode文件,当您尝试将其重新导入时,将显示错误消息The format of the task is not valid. The following error was reported: (1,2)::。将文件保存为ANSI可以为我解决。
Erik Anderson

非常感谢,这确实是最好的解决方案。如文档所述,您还可以设置更高的优先级(至少为1),以获得更高的CPU优先级。
符文阿莫德

对于任何认为您可以在注册表中进行调整的人,请不要打扰,似乎也无法以一种很好的可编辑方式进行修改。
Nik

1

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

如果执行此操作,是否需要更长或更短的时间?我不知道这意味着什么,但这可能是一个有用的区分因素。用户帐户登录时是否存在某些网络访问权,但作为计划任务运行时却没有,需要超时并失败?如果您创建一个新用户帐户并将其作为该帐户下的计划任务运行,该行为是否有所不同?

另一个想法:当将其作为计划任务运行时-既然您已经固定了脚本的优先级,那么子流程是否都以“正常”或“低于正常”运行?


1
经procexp / taskman验证,子进程肯定以“正常”运行。我认为不是网络问题,因为它不进行任何实质性的网络访问,但是我会仔细检查。关于以交互方式运行任务的想法也很有趣,我将尝试一下。
查理

该过程本身不必进行任何您知道的网络访问,就可以解决此问题。阅读Sysinternals的这篇文章,看看看似无关的东西如何导致挂起/缓慢。 blogs.technet.com/b/markrussinovich/archive/2005/08/28/...
mfinni

1

默认情况下,计划的任务可能会以较低的优先级运行。

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


没错,它们的运行优先级较低,但是正如我提到的,我已经对此做了解释。除非有我不知道的优先级,而不是进程优先级。
查理

0

首先-您可以使用比普通优先级更高的优先级(例如,高)

第二点-您必须了解,前台会话要占用一些资源,主要是硬盘IO和内存,因此计划的任务会少一些。为了获得清晰的基准,您必须在运行PowerShell脚本时注销

并且您也可以尝试添加更多内存/使用ramdrive /在多个硬盘上拆分工作以加快处理速度


感谢您的想法。该机器具有足够的内存和IO容量,问题在于作为计划任务运行的速度比它们以交互方式运行的速度慢。当计划任务运行时,通常没有交互式登录会话,因此我也不是问题所在。
查理

0

这个问题来自不久前的Windows Server 2008R2。我有同样的问题,但对于Windows10。在Windows 10(在1703和1809上验证)上,仅通过导入的xml将“优先级”设置为4即可为您提供相同的基本优先级,动态优先级,I / O优先级以及“内存优先级”作为交互式启动的过程。


0

这是用于设置优先级的powershell代码段(可在远程powershell会话中使用!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = New-ScheduledTaskSettingsSet ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Trigger $currentTask.Triggers -Action $currentTask.Actions -Settings $settings -User "NT AUTHORITY\SYSTEM"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.