如何配置Windows服务进程以低优先级运行?


17

是否可以将Windows服务进程(例如squidNT,SQL Server等)配置为以低优先级自动启动,而无需通过任务管理器手动更改进程优先级?


除非已编写代码以不同的优先级运行,否则更改线程或进程的优先级通常不是一个好主意。更改优先级可以将“优先级倒置”添加到要避免的并发问题列表中。
理查德

1
OP没有询问这是否是一个好主意。OP询问是否可以完成,以及如何进行。-请记住保持话题。😉
BrainSlugs83

Answers:


11

处理启动/停止服务的服务控制管理器没有任何机制(在任何Windows版本之前)都不能指定其启动进程的优先级。

由于您可以在已经运行的流程上修改优先级,因此最好的选择是使用工具来做到这一点。

我不知道可以使用Microsoft命令行工具来修改进程优先级,但是http://www.teamcti.com/pview/prcview.htm上的“ PV”命令行也具有设置优先级的功能。 。

pv -pb process-name.exe

这会将“ process-name.exe”设置为“低于正常”优先级。

如果您可以忍受以“正常”优先级开始的流程,直到可以进行更改为止,则可以使用作为“计划任务”运行的脚本来执行,以每隔一段时间触发一次(以防服务获取弹跳)。

这是一个快速而又肮脏的hack,但是我将自己的一生都归功于快速而又肮脏的hack,使工作得以完成!


也许运行批处理文件以启动应用程序,然后设置进程优先级,中间可能需要短暂睡眠,而不是直接运行应用程序,然后运行另一个任务来设置优先级。不能为所有事情工作,但值得一试。
约翰·加迪尼尔

3

以上答案对我没有用。我结束了以下Powershell脚本的创建:

ChangePriority.ps1

Get-WmiObject Win32_process -Filter 'name="ProcessName.exe"' | ForEach-Object {$_.SetPriority(128)}

然后,我创建了一个计划任务,每5分钟调用一次。从管理员提示或批处理脚本中:

schtasks /Create /tn "Process Priority Change" /sc MINUTE /mo 5 /ru SYSTEM /tr "powershell -noprofile -executionpolicy bypass -file \"%cd%\ChangePriority.ps1\""

尝试使用此处wmic讨论的方法使计划任务不取决于文件失败。使用Powershell脚本的相似之处:我无法仅创建一个命令,而仅使用内联脚本创建任务。感谢您是否成功完成并添加了另一个答案。

Powershell脚本中的优先级值可在此处找到[1]。

[1] https://docs.microsoft.com/zh-CN/windows/desktop/cimwin32prov/setpriority-method-in-class-win32-process


很有用。我用我较差的ps技能砍了一条线,将包含服务主机进程的音频服务设置为实时,以防止在频繁使用cpu期间出现音频crack啪声(我猜是错误的驱动程序)。很棒!
JasonXA

@JasonXA不客气。感谢您是否可以提供它的单一版本,但我无法提供
ceztko

确定:PowerShell.exe -noprofile -executionpolicy绕过-command“&{Get-WmiObject Win32_service -Filter \” Name ='AudioSrv'\“ | ForEach {Get-WmiObject Win32_process -Filter \” ProcessId = $($ _。ProcessId) \“} | ForEach-Object {$ _。SetPriority(256)}}”我不知道它有多正确...但是它可以工作。我没有设法使其隐藏起来,只能在w / admin priv用户下工作。
JasonXA

1

以下可能也可以。编辑ImagePath注册表项,然后使用cmd.exe中的启动命令:

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [command/program]
      [parameters]

不幸的是,这根本不起作用,因为启动的可执行文件ImagePath必须遵守Windows服务的接口,并且start不实现,也不会将其路由到正在启动的可执行文件。
ceztko

0

我必须这样做,以使teamcity减少cpu。而且,由于teamcity是我们正在运行的唯一Java应用程序,因此该解决方案可以完美运行。

  1. 将服务设置为启动“手动”。
  2. 创建一个批处理文件,它将启动您的服务,并降低优先级,例如:

    net start tcbuildagent
    net start teamcity
    wmic进程,其中name =“ java.exe” CALL setpriority“低于正常”

  3. 创建一个“任务计划程序”作业,该作业在“ Windows启动”时触发,将启动该批处理文件。

我将TaskScheduler触发器配置为延迟1分钟,以不干扰其他服务的启动。

ps,您还可以将所有服务启动设置为手动,然后使用该批处理文件按所需顺序启动所有服务!SQL,IIS等


0

您可以将以下powershell脚本放入启动时运行的计划任务中。

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
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.