我有一个计划任务,它非常耗费 CPU 和 IO,运行大约需要四个小时(如果您好奇的话,可以构建源代码)。该任务是一个 Powershell 脚本,它会产生各种子进程来完成其工作。当我从 Powershell 提示符以交互方式运行相同的进程时,作为相同的用户帐户,它大约需要两个半小时才能运行。该任务在 Windows Server 2008 R2 上运行。
我想知道的是为什么作为计划任务运行需要这么长时间——超过一个小时。我注意到的一件事是任务调度程序以低于正常优先级运行,因此当我的任务启动时,它会继承相同的降低优先级。但是,我已更新脚本以将 Powershell 进程优先级设置回正常,但它仍然需要同样长的时间。
有人知道这两种情况之间可能有什么不同吗?我已经排除了处理器和 IO 负载的差异 - 此任务是系统的唯一用途,因此没有其他可以争用资源的运行。
答案1
看来这里不仅仅是“常规”进程优先级在起作用。正如我在问题中指出的那样,任务调度程序默认以低于正常优先级的优先级运行您的任务。StackOverflow 上的这个问题描述了如何修复任何任务以正常优先级运行,但修复仍然留下了一点略有不同:内存优先级。内存优先级是 Windows Vista 的一项新功能,在这篇 Technet 文章. 您可以使用以下方式查看内存优先级进程探索器,这是任何管理员或程序员必备的工具。
无论如何,即使修复了计划任务优先级,任务的内存优先级也会设置为 4,比正常设置 5 低一个等级。当我手动将任务的内存优先级提高到 5 时,性能与以交互方式运行该过程相当。
有关提高优先级的信息,请参阅我对相关 StackOverflow 问题的回答关于 IO 优先级;设置内存优先级的方法类似,通过 NtSetInformationProcess,PROCESS_INFORMATION_CLASS
设置为ProcessMemoryPriority
(该值为 39 或 0x27)。如果其他人需要它并且无法使用程序员工具,我可能会制作一个可用于设置它的免费实用程序。
编辑:我已经编写了一个免费的实用程序来查询和设置任务的内存优先级,可在此处获得。下载内容包含源代码和已编译的二进制文件。
答案2
问题是您的进程以低 I/O 优先级和低内存优先级启动。验证这一点的最简单方法是使用 sysinternals 中的进程资源管理器。如果您查看从此计划任务生成的任何进程的属性,您将看到它的 I/O 优先级为低,内存优先级为 2。
以下是此问题的解决方案:
- 创建任务
- 右键单击任务并“导出”
- 编辑刚刚导出的task.xml文件
- 你会发现类似这样的一行
<Priority>7</Priority>
- 将值更改为正常优先级(4-6 之间)。潜在值的表格:TaskSettings.Priority 属性
- 值为 4 时,I/O 和内存优先级与交互式进程相同。值为 5 和 6 时,内存优先级较低
- 在任务计划程序中,删除最初创建的任务
- 在任务计划程序的操作区域中,从 XML 文件导入任务
不幸的是,无法从 GUI 修改计划任务的初始优先级。
答案3
下面是用于设置优先级的 powershell 代码片段(在远程 powershell 会话中有效!):
$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings
答案4
也许计划任务默认以较低的优先级运行。
用于prio
强制提高优先级。