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
}
Loved your LED driver troubleshooting tips. A specialist from professional licensed electrician resolved flicker issues.
Hi, its fastidious post about media print, we all be aware of media is a great source of information.
https://www.google.com.mm/maps/d/edit?mid=1wCMEYzjd4xdFfOejc9cydZOkQBCKFLY
Thank you for the thoughtful take on accessibility in healthcare tech. We’re prioritizing inclusive layout at IHBS near me,
В этой статье мы рассмотрим современные достижения в области медицины, включая инновационные методы лечения и диагностики. Мы обсудим важность профилактики заболеваний и роль технологий в улучшении качества здравоохранения. Читатели узнают о влиянии медицины на повседневную жизнь и ее значение для современного общества.
Получить дополнительные сведения – [url=http://mymylife.ru/narkologiya/140068-lechenie-alkogolizma-kakie-sovremennye-metody-borby-ispolzuyutsya]стоп алко новосибирск[/url]
I found this very interesting. Check out dietas personalizadas for more.
Hey very cool web site!! Guy .. Beautiful .. Superb .. I will bookmark your web site and take the feeds also? I am satisfied to search out a lot of helpful information right here in the post, we’d like develop extra strategies in this regard, thank you for sharing. . . . . .
https://www.google.com.sb/maps/d/edit?mid=11uy5GX5v0IzcNxvenlkuvcx6c3PRuU8
Do you have a spam problem on this site; I also am a blogger, and I was wanting to know your situation; we have developed some nice practices and we are looking to trade solutions with others, why not shoot me an e-mail if interested.
https://www.google.ca/maps/d/edit?mid=1LeIkCzNWnoHd-Hr6boUAo2q31wakYRk
After replacing a cracked lid, we added child-safe locks per a safety checklist on licensed septic tank pumping .
How do people keep up with annual plumbing maintenance reminders? I set calendar alerts but am thinking about signing up for scheduled visits through companies like Spartan Plumbing Services so nothing slips through the cracks! Plumbing in Tacoma
I loved as much as you will receive carried out right here. The sketch is attractive, your authored material stylish. nonetheless, you command get got an impatience over that you wish be delivering the following. unwell unquestionably come more formerly again as exactly the same nearly a lot often inside case you shield this hike.
https://www.google.ro/maps/d/edit?mid=1LeIkCzNWnoHd-Hr6boUAo2q31wakYRk
Spinsy Italia
Thanks for highlighting the signs of a full tank. Gurgling drains were my first clue. If anyone needs a checklist, residential septic tank emptying has a solid one.
This was very enlightening. More at Vitalty Dental .
Hi everyone, it’s my first visit at this web site, and paragraph is truly fruitful in favor of me, keep up posting these posts.
https://www.google.dm/maps/d/edit?mid=1mV7qvORxKwfv_pLPESUF3i2At5SNG0o
Читатели получат представление о том, как современные технологии влияют на развитие медицины. Обсуждаются новые методы лечения, персонализированный подход и роль цифровых решений в повышении качества медицинских услуг.
Рассмотреть проблему всесторонне – [url=https://zdorovo-tak.info/zdorovie/lechenie/1150-effektivnyj-vyvod-iz-zapoya-domashnimi-sredstvami.html]стоп алко[/url]
Thanks for the insightful write-up. More like this at assisted living .
Thanks for the great tips. Discover more at respite care .
This was highly informative. Check out elderly care for more.
Casino in South Africa Casino in South Africa
Thanks for the helpful information. Anyone seeking an assisted living home can start their search with elderly care for curated options.
At this time it looks like WordPress is the best blogging platform available right now. (from what I’ve read) Is that what you’re using on your blog?
https://www.google.hu/maps/d/edit?mid=1kKZlBn_6FEctcdirJyJBZBftKM0zy_w
Appreciate the thorough insights. For more, visit respite care .
Howdy this is kind of of off topic but I was wanting to know if blogs use WYSIWYG editors or if you have to manually code with HTML. I’m starting a blog soon but have no coding experience so I wanted to get advice from someone with experience. Any help would be greatly appreciated!
https://www.google.co.ma/maps/d/edit?mid=1J6zy2Hkxq1RM8jlxdf9bZSXYay-QMoA
Nice coverage of maintenance tools — for reliable Metal Roofing Contractor Los Angeles help, check Eclipse Metal Roofing eclipsemetalroofing.com .
M88US là nền tảng giải trí trực tuyến được xây dựng theo hướng hiện đại, chú trọng tốc độ truy cập, sự ổn định và trải nghiệm thuận tiện cho người dùng bbc
Hello there, just became alert to your blog through
Google, and found that it’s really informative.
I’m going to watch out for brussels. I will appreciate
if you continue this in future. A lot of people will be benefited from
your writing. Cheers!
Thanks for sharing your thoughts. I really appreciate your efforts and I am waiting for your further write ups thanks once again.
https://www.google.as/maps/d/edit?mid=1dqfCwH5twBp0040gOQYJErpsjHgHvkA
For gravel driveways, culverts and grading stop washouts. Hired a drainage pro via septic repair .
NET88 mang đến không gian giải trí trực tuyến được tối ưu theo hướng rõ ràng, hiện đại và thuận tiện cho nhiều nhóm người dùng bbc
Ставка на любовь – 2 сезон. Любовь, страсть и неожиданные повороты возвращаются! Новые герои, жаркие свидания и судьбоносные решения – кто рискнёт всем ради чувств? Драматичные признания, сложный выбор и финал, от которого захватывает дух. Не пропусти ни одной серии – включай прямо сейчас: шоу Ставка на любовь 2 сезон
FM88 là nền tảng giải trí trực tuyến được phát triển theo hướng linh hoạt, dễ sử dụng và phù hợp với nhu cầu trải nghiệm hiện đại. Website mang đến giao diện gọn gàng, tốc độ tải ổn định và khả năng điều hướng thuận tiện giữa các chuyên mục bbc
NOHU90 là nền tảng giải trí trực tuyến nổi bật với phong cách năng động, tập trung vào sự nhanh gọn, ổn định và dễ thao tác cho người dùng bbc
Multi-entry venues benefit from restroom clusters at every gate— portable restroom rentals explains why.
What’s up colleagues, nice piece of writing and good arguments commented at this place, I am really enjoying by these.
https://www.google.com.vc/maps/d/edit?mid=1OtInPwVO58xwt_JNgZ-tQyEzCHic3eU
Love the code-compliant bathroom circuits guide. Find electricians via Las Vegas electrical contractor .
Helpful notes on picking ice and water maintain. roofer near me estimate carried out it in all significant spaces.
I recently dealt with a stubborn kitchen sink blockage, and it was a nightmare until I learned about regular drain cleaning Commercial Plumbing Tacoma
Clear and helpful — for opener troubleshooting in Mint Hill NC, call garage door company .
Helpful read. I trusted Roofing contractor in Frisco for my Frisco home’s roof inspection and repairs.
Consider motion sensors for security lighting; setup at Dallas electrical services .
Grounding and bonding are often misunderstood; electrician Richardson TX breaks down electrode systems in plain language.
Informative post. LA residents should keep control near me in mind for rodent emergencies.
Excellent tips. Tucson homeowners should schedule annual safety checks for cables, springs, and opener settings. nearest garage door repair
I liked the emergency checklist. If your Fayetteville AC goes out, contact support via AC emergency repair near me .
Useful advice! For more, visit mold inspection davis islands .
Когда симптомы становятся настолько выраженными, что они мешают нормальному функционированию, капельница становится необходимостью. Она помогает избавиться от дискомфорта и значительно ускоряет процесс восстановления, давая организму все необходимые вещества для нормализации его работы, при этом может проводиться наркологическая детоксикация. Контроль врача на протяжении всей процедуры гарантирует, что капельница будет введена правильно и безопасно, с учетом всех показателей пациента, а при необходимости можно заказать дальнейшую реабилитацию и кодирование.
Получить больше информации – [url=https://kapelnicza-ot-pokhmelya-samara-13.ru/]капельница от похмелья на дом в самаре[/url]
This guide made it less daunting— rubbish pickup Sydney took care of the heavy lifting.
Раздел об инженерной сантехнике: трубах, фитингах, арматуре, водонагревателях, насосах, фильтрах и защите от протечек. Здесь собраны практичные материалы для тех, кто проектирует, ремонтирует или обслуживает водоснабжение, отопление и канализацию, https://santexnik-market.ru/category/inzhenernaya-santehnika/
Great resource on avoiding rogue movers. I vetted Lincoln long distance companies on Cheap movers Lincoln before signing.
If you’re crossing state lines into Reno, Reno Movers covers permits and weigh station basics.