Windows服务器限制进程CPU使用率

时间:2024-02-24 19:00:12

在Windows server 2012 之前的服务系统 2008和2008 R2中有系统资源管理器System Resource Manager可以管理系统的CPU和内存使用情况。特别对于一些自己开发的有瑕疵的程序可以限制它对系统资源的占用,同时又可以保整系统以及其它程序可以正常运行。这个功能本意是为了终端服务使用的,避免某个用户占用过多的系统资源而对其它用户造成影响。但确实也可以根据Equal_Per_Process的策略来达到限制进程对CPU的过分占用。不过这个功能从2012版本的Windows服务器系统中被削减了。
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831568(v=ws.11)?redirectedfrom=MSDN

对于目前2019,2016的系统如何限制进程对CPU的过分占用呢?我们可以换个思路。当前服务器都是多CPU,多CPU核心的。Windows系统可以让特定的进程只能在某个或者某几个CPU核心上运行,从而达到保留部分系统资源,确保基本系统可以正常运行的目的。https://www.cnblogs.com/qishine/p/12633999.html

先来看看应当如何设置。传统的图形界面中,在任务管理器中找到需要设置的进程,右击选择设置相关性Set affinity来选择当前进程可以在哪些CPU上运行。

在系统启动后,可以通过powershell命令来设置。get-process cmd | % { $_.ProcessorAffinity=0x7 }这个命令表示将所有的cmd进程限制在CPU0,1,2上运行。其中ProcessorAffinity后的参数是根据2进制掩码来计算的。最低位代表CPU0。示例中的0x7转换成2进制就是0111。如果需要让程序在4个CPU上运行,那么参数就是15或者0xF。如果需要程序运行在CPU0,1,3上那么参数就是11或者0xB

看一下,我成功的将一台有问题程序的Windows服务器的CPU限制在66%。这个服务器上有程序存在瑕疵,当一段时间后就会占用100%CPU,之前都是通过重启系统解决的。现在通过CPU相关性的设置,即使这个程序依然有问题,但是对系统CPU的占用只能达到66%。当然,从根本上还是应该从应用程序上来解决这类问题。