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

Cha*_*lie 46 performance scheduled-task windows-server-2008-r2

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

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

有人知道这两种情况有什么不同吗?我已经排除了处理器和 IO 负载的差异——这个任务是系统唯一的用途,所以没有其他运行可以竞争资源。

Cha*_*lie 40

似乎在这里工作的不仅仅是“常规”流程优先级。正如我在问题中所指出的,默认情况下,任务调度程序以低于正常优先级的优先级运行您的任务。StackOverflow 上的这个问题描述了如何修复以正常优先级运行的任何任务,但修复仍然留下一点不同:内存优先级。内存优先级是 Windows Vista 的一项新功能,在这篇 Technet 文章 中进行了描述。您可以使用Process Explorer来查看内存优先级,它是任何管理员或程序员的必备工具。

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

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

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


小智 20

问题是您的进程以低 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 修改计划任务的初始优先级。


小智 5

这是用于设置优先级的 powershell 片段(在远程 powershell 会话中工作!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings
Run Code Online (Sandbox Code Playgroud)