Windows自身没有提供类似Linux cgroup的能力来限制进程或进程组的资源占用,进程CPU/IO/内存/网络等资源的控制只能由自己实现。目前已有第三方的实现,主要是限制进程CPU的占用,如文档 < 21 Best Ways to Limit the CPU Usage of a Process > 所描述的BES,Process Tamer等软件。自Windows 8及Server 2012开始Windows系统有提供以job为单位的CPU占用及内存上限设置,之前的版本则只能以进程或线程为单位进行限制。
进程CPU占用限制方案
即时轮询系统所有进程(线程)的CPU占用,当发现所设定进程有超标时强制暂停进程所有线程的执行,然后在适当的时机再恢复执行。其中所涉及技术点:
进程CPU占用查询 GetProcessTimes
BOOL GetProcessTimes(
[in] HANDLE hProcess,
[out] LPFILETIME lpCreationTime,
[out] LPFILETIME lpExitTime,
[out] LPFILETIME lpKernelTime,
[out] LPFILETIME lpUserTime
);
此函数可以获取进程从创建至当前的总运行时间及总的CPU时间,(KernelTime + UserTime) < 系统CPU数 * (当前时间 - CreationTime)
线程CPU占用查询 GetThreadTimes
BOOL GetThreadTimes(
[in] HANDLE hThread,
[out] LPFILETIME lpCreationTime,
[out] LPFILETIME lpExitTime,
[out] LPFILETIME lpKernelTime,
[out] LPFILETIME lpUserTime
);
QueryThreadCycleTime可以提供更精准的CPU时间数据,单位为CPU时钟周期
BOOL QueryThreadCycleTime(
[in] HANDLE ThreadHandle,
[out] PULONG64 CycleTime
);
线程暂停及恢复
Windows平台没有提供暂停整个进程的支持函数,只能以线程为单位来操作,即SuspendThread及ResumeThread:
DWORD SuspendThread(
[in] HANDLE hThread
);
DWORD ResumeThread(
[in] HANDLE hThread
);
CPU亲和性设置: SetProcessAffinityMask
BOOL SetProcessAffinityMask(
[in] HANDLE hProcess,
[in] DWORD_PTR dwProcessAffinityMask
);
此函数可以限定进程及其所有线程所能使用的CPU,故一定程序上亦限定了进程最大的系统CPU占用率。
DWORD_PTR SetThreadAffinityMask(
[in] HANDLE hThread,
[in] DWORD_PTR dwThreadAffinityMask
);
此函数可单独限制特定线程的CPU亲和性。
进程优先级设置: SetPriorityClass
优先级解决的是优先运行及退让CPU的问题,本质上并不能限定CPU占用,只是优先级高于当前任务的忙碌的时候,当前进程会主动退让CPU 线程优先级设置:SetThreadPriority
BOOL SetThreadPriority(
[in] HANDLE hThread,
[in] int nPriority
);
Job Objects
Windows系统提供了Job的概念用以管理多个进程,可以限制Job对象内所有进程及期线程的CPU核心占用、CPU占用及内存分配上限等,均通过SetInformationJobObject来实现,具体的CPU限制由JOBOBJECT_CPU_RATE_CONTROL_INFORMATION管理,内存限制则由JOBOBJECT_EXTENDED_LIMIT_INFORMATION来管理。
BOOL SetInformationJobObject(
[in] HANDLE hJob,
[in] JOBOBJECTINFOCLASS JobObjectInformationClass,
[in] LPVOID lpJobObjectInformation,
[in] DWORD cbJobObjectInformationLength
);
需要注意的是CPU占用设置只有Windows 8及Server 2012之后的版本有效。
CPU Sets
此部分只限定了CPU Affinity属性
实验验证
可以直接利用开源项目go-winjob验证,验证系统Windows 8 x64,go-winjob git repo: https://github.com/kolesnikovae/go-winjob
验证程序
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
unsigned long total = 0, count = 0, i = 0;
while (1) {
if (malloc(1024)) {
total += 1024;
count++;
}
if (!(++i & 4095))
printf("alloc: %u size: %u bytes\n", count, total);
}
}
无限制
在无限制的情况下,此进程会占满一个CPU核心,commit内存总占用达2G

单一进程
在设定CPU上限16%及内存16M上限之后,结果如下:
examples/job_object.go按如下修改:
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithProcessMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
const defaultCommand = ".\\CPUStress.exe"
多进程(双进程)
将winjob.WithProcessMemoryLimit 改为 winjob.WithJobMemoryLimit,后者表示此job内所有进程要占用的总内存限制:
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithJobMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
验证结果如下:

winjob example代码:
// +build windows
package main
import (
"encoding/json"
"log"
"os"
"os/exec"
"os/signal"
"time"
"golang.org/x/sys/windows"
"github.com/kolesnikovae/go-winjob"
)
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithJobMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
const defaultCommand = ".\\CPUStress.exe"
const stressCommand = ".\\CPUStressX64.exe"
func main() {
job, err := winjob.Create("", limits...)
if err != nil {
log.Fatalf("Create: %v", err)
}
cmd := exec.Command(defaultCommand)
cmd.Stderr = os.Stderr
cmd.SysProcAttr = &windows.SysProcAttr{
CreationFlags: windows.CREATE_SUSPENDED,
}
if err := cmd.Start(); err != nil {
log.Fatalf("Start: %v", err)
}
stress := exec.Command(stressCommand)
stress.Stderr = os.Stderr
stress.SysProcAttr = &windows.SysProcAttr{
CreationFlags: windows.CREATE_SUSPENDED,
}
if err := stress.Start(); err != nil {
log.Fatalf("Start: %v", err)
}
s := make(chan os.Signal, 1)
signal.Notify(s, os.Interrupt)
c := make(chan winjob.Notification)
subscription, err := winjob.Notify(c, job)
if err != nil {
log.Fatalf("Notify: %v", err)
}
done := make(chan struct{})
go func() {
defer close(done)
ticker := time.NewTicker(time.Second * 5)
defer ticker.Stop()
var counters winjob.Counters
for {
select {
case <-s:
log.Println("Closing job object")
if err := job.Close(); err != nil {
log.Fatal(err)
}
log.Println("Closing subscription")
if err := subscription.Close(); err != nil {
log.Fatal(err)
}
return
case n, ok := <-c:
if ok {
log.Printf("Notification: %#v\n", n)
} else if err := subscription.Err(); err != nil {
log.Fatalf("Subscription: %v", err)
}
case <-ticker.C:
if err := job.QueryCounters(&counters); err != nil {
log.Fatalf("QueryCounters: %v", err)
}
b, err := json.MarshalIndent(counters, "", "\t")
if err != nil {
log.Fatal(err)
}
log.Printf("Counters: \n%s\n", b)
}
}
}()
if err := job.Assign(cmd.Process); err != nil {
log.Fatalf("Assign: %v", err)
}
if err := winjob.Resume(cmd); err != nil {
log.Fatalf("Resume: %v", err)
}
if err := job.Assign(stress.Process); err != nil {
log.Fatalf("Assign: %v", err)
}
if err := winjob.Resume(stress); err != nil {
log.Fatalf("Resume: %v", err)
}
if err := cmd.Wait(); err != nil {
log.Fatalf("Wait: %v", err)
}
if err := stress.Wait(); err != nil {
log.Fatalf("Wait: %v", err)
}
// Wait for a signal.
<-done
}
Thanks for the valuable article. More at Denver Regenerative Med .
“I’m hopeful that more businesses will start prioritizing sustainability by investing in renewable energy like commercial solar!” commercial solar in southern california
If you’re considering alternative dispute resolution methods, check what’s available via # family lawyer in maryland # for expert guidance!
This was highly educational. For more, visit Paxos Electric Co LLC .
Thanks for the useful post. More like this at Visitar este sitio .
Does anyone have tips on budgeting for renovations with a ### anyKeyword###? Custom home building Woodland Hills
мелбет лучшие слоты [url=www.melbet74825.help]мелбет лучшие слоты[/url]
I recently started looking for a new home in Los Angeles, and the local builders have some amazing options! Los Angeles kitchen Remodeling
For teen driver accidents, car accident lawyer provides parent-focused guidance.
Fantastic read with tons of practical insights into choosing the right contractor—so vital here; will certainly look into options presented at %%site%%! Roof Installation Southfield
мостбет как связаться с поддержкой [url=www.mostbet73481.help]www.mostbet73481.help[/url]
Excited about exploring different types of luxury vessels suited perfectly tailored towards accommodating group activities contact us today using ### any keyword ### newport beach charter yacht
Code compliance can be tricky during remodels; I rely on plumbing repair in Irving to vet licensed plumbers.
I delight in, cause I found exactly what I was taking
a look for. You have ended my 4 day long hunt! God Bless you man. Have a
nice day. Bye
This put up satisfied me to swap to LVP. I obtained samples from flooring store Houston and the shade number used to be sizeable.
Such practical tips shared throughout your article—I’m excited about reaching out to roof replacement in illinois
mostbet roʻyxatdan oʻtish muammo [url=http://mostbet91372.help]mostbet roʻyxatdan oʻtish muammo[/url]
Does anyone have favorite resources or articles they recommend regarding this topic? I trust insights shared by sites like #allaboutregeneration.” Pain Management Doctor For Chronic Pain
How most commonly do you reseal grout in Denver showers to save it looking brand new? flooring store Denver
If you value clear explanations and thorough service, contact ## Laguna Niguel estate planning attorney
The gravel vs. mulch comparison was helpful. I’ll ask landscaping company in Charlotte which works best for drainage.
Don’t let legal problems weigh you down—check out small business lawyer maryland for resources that can help you find the right attorney in Maryland!
If you’re new to dumpster rentals, start with size guidance and local quotes at dumpster rental services pricing .
The importance of consulting professionals during a remodel cannot be understated; great reminder here—additional resources available at Kitchen Remodeling Services In Los Angeles !
Отдельно оценивают ситуации, когда подобные эпизоды повторяются. Если человек уже не впервые переносит запой, тяжелый выход из него или выраженное ухудшение самочувствия после алкоголя, вопрос обычно выходит за рамки разовой помощи. Тогда уже при первичном обращении рассматривают не только текущую стабилизацию состояния, но и дальнейшие шаги. При затяжном течении проблемы могут обсуждаться лечение зависимости, программа восстановления и условия, при которых потребуется наблюдение в стационаре.
Углубиться в тему – [url=https://narkolog-na-dom-moskva-17.ru/]www.domen.ru[/url]
Thank you for the myth-busting section. I spotted more common myths at trusted exterminator service .
I found this very helpful. For additional info, visit Denver Regenerative Medicine Clinic .
melbet aviator скачать [url=https://melbet74825.help]https://melbet74825.help[/url]
The collaboration between tech and biology offers limitless possibilities; see what’s happening through ### any Keyword##! Ketamine Infusion Therapy orange county
Does a person bundle staircase refinishing with fundamental-floor installs in Denver for more effective pricing? top flooring store Denver
Вывод из запоя на дому требуется в тех случаях, когда человек сталкивается с длительным непрерывным употреблением алкоголя, которое приводит к тяжелым последствиям для организма. Это состояние опасно не только для здоровья, но и для жизни, поэтому быстрое вмешательство специалистов необходимо, при этом можно заказать наркологическая помощь. Врач на дому помогает пациенту выйти из запоя безопасно, минимизируя риски для его здоровья, что является особенно важно для больного, включая случаи наркомании, а также с учетом его данных, возраста (в том числе после 40–50 лет) и актуальной цена лечения для тех, кто не хочет или не может пройти лечение в стационаре.
Подробнее тут – [url=https://vyvod-iz-zapoya-na-domu-ekaterinburg-16.ru/]вывод из запоя на дому анонимно[/url]
This trend looks to present brilliant fee for funds in in the present day’s industry. Please share greater surface plan possibilities. Maybelle Manor
The step-by-step guide you provided is so helpful, especially for newbies like me looking into roof installations in Southfield—thanks again, and will check out Home improvement Southfield MI
“If anyone has questions about their system upkeep, look no further than the knowledgeable staff at epoxy floor coating san dimas .”
мелбет лайв казино [url=https://melbet74825.help]мелбет лайв казино[/url]
Yacht charters provide an exclusive setting that can really enhance any corporate event experience in Newport Beach! Discover yours at newport beach charter yacht .
“If you’re still hesitating about going with commercial solar, consider all the benefits highlighted here!” Tesla solar power installer
I loved the notion of neutral stains for resale. wood floor refinishing Denver guided me to a heat medium tone that Denver patrons love.
Thanks for the humidity keep an eye on reminder. Moisture-rated floors at flooring store Charleston labored smartly for my Charleston abode.
It’s fascinating to see how much work goes into being a successful Custom home building Woodland Hills .
mostbet ozini cheklash [url=mostbet91372.help]mostbet91372.help[/url]
I’m looking into options for my arthritis and think a visit to regenerative medicine scottsdale might be beneficial.
Grateful witnessing transformations happening right before our eyes showcasing resilience within communities striving thrive above all odds remaining steadfast along paths chosen today onward forevermore always!!##:_anykeyword:## los angeles general contractor
мелбет актуальный сайт [url=www.melbet74825.help]www.melbet74825.help[/url]
Домашний формат помощи рассматривают тогда, когда человеку тяжело добраться до медицинского учреждения, состояние ухудшается после нескольких дней употребления спиртного или родственникам требуется очная оценка без промедления. После осмотра становится ясно, допустима ли помощь на дому, требуется ли капельница, можно ли ограничиться наблюдением в домашних условиях или нужен другой маршрут помощи. Вопрос о том, как вызвать специалиста, нередко возникает в ситуациях, когда состояние нарастает быстро и требуется решение без откладывания. Если подобные эпизоды повторяются, дальнейшее обсуждение может касаться не только текущего состояния, но и лечения алкоголизма, работы с зависимостью и более длительной программы восстановления.
Выяснить больше – [url=https://narkolog-na-dom-moskva-21.ru/]нарколог на дом анонимно москва[/url]
Just had LVP hooked up from a flooring store Buffalo, and I discovered repairs guidelines from flooring store Buffalo .
Web design London—don’t forget print-to-digital brand consistency; checklist: london ontario web design .
Get ahead of future challenges by consulting an expert via ## orange county estate planning attorney
If the insurer denies liability, car accident lawyer can evaluate your appeal strategy.
Love the focus on sustainability in kitchen remodeling! It’s such an important factor today. Discover more at Kitchen Remodeling Services In Los Angeles !