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
}
Great tips for keeping a business move organized. Professional commercial movers in Prior Lake can help with packing, transport, and setup. Prior Lake international movers
Boat get together > bar crawl. Try Austin get together boat leases on Lake Travis. good time tours austin party boat rentals
I can also write 30 personalized outreach messages for: lawn service
This was a clear and practical guide. Pre-emergent treatments can be very effective when applied at the right time. For expert service, tree service may be useful.
Hey I know this is off topic but I was wondering if you knew of any widgets I could add to
my blog that automatically tweet my newest twitter updates.
I’ve been looking for a plug-in like this for quite some time and was hoping maybe you would have some
experience with something like this. Please let me know if you run into anything.
I truly enjoy reading your blog and I look forward to your new updates.
Moving your office on a budget in Tampa? I got competitive commercial rates after checking Tampa moving company .
For students near USF Sarasota-Manatee, small-load specials are great—found discounts via Sarasota movers .
First-time shipper here; Stockton vehicle shipping explained insurance deductibles and helped me pick a solid Stockton carrier.
Now I am ready to do my breakfast, later than having my breakfast coming over
again to read more news.
Also visit my web-site: casinotop10
Does anyone have advice on timing around Keeneland traffic? My driver from Lexington car shipping suggested midweek delivery to avoid congestion.
Howdy, i read your blog occasionally and i own a similar one and i was just wondering if you get a lot
of spam comments? If so how do you prevent it,
any plugin or anything you can suggest? I get so much
lately it’s driving me crazy so any help is very much appreciated.
spread betting options
Check out my blog: sportsbooks Online; https://basketball-wetten.com/,
online casino ohne oasis klarna casino mit ecopayz einzahlen
Is door-to-door realistic near downtown Orlando condos? I had to meet curbside, but Orlando auto transport coordinated smoothly.
אחרי הרבה בדיקות בחרנו ב- תנאי משכנתא לגיל השלישי והם ליוו אותנו עד החתימה בצורה מקצועית וסבלנית.
บทความนี้ อ่านแล้วเพลินและได้สาระ ค่ะ
ดิฉัน ได้อ่านบทความที่เกี่ยวข้องกับ หัวข้อที่คล้ายกัน
ซึ่งอยู่ที่ Chester
เผื่อใครสนใจ
เพราะอธิบายไว้ละเอียด
ขอบคุณที่แชร์ ข้อมูลที่มีประโยชน์ นี้
จะรอติดตามเนื้อหาใหม่ๆ ต่อไป
Can I simply say what a relief to uncover someone that truly understands what they’re talking about over the internet. You actually know how to bring an issue to light and make it important. More and more people should read this and understand this side of your story. I can’t believe you are not more popular given that you certainly possess the gift.
Link exchange is nothing else but it is only placing the other person’s weblog link
on your page at proper place and other person will
also do similar in support of you.
Whether moving for work, school, or family, international relocation from Winston-Salem needs organized planning. Check this out: Winston Salem commercial movers
We floated via Devil’s Cove at the appropriate time because of good time tours austin party boat rentals
Hello, for all time i used to check webpage posts here in the
early hours in the daylight, since i enjoy to find out more
and more.
Мы работаем круглосуточно, принимаем заявку по телефону, а выезд возможен в любое время суток, включая выходных и праздничные дней. Вызов нарколога на дом помогает быстро оказать помощь больного, стабилизировать физические и психического состояния, снять острые симптомы употребления алкоголя, наркотиков или лекарственных веществ.
Подробнее тут – [url=https://narkolog-na-dom-kazan24.ru/]нарколог на дом[/url]
Важное преимущество услуги — анонимность. Информация о пациента, обращении, адрес, диагноз, лечение, консультация, стоимость, препараты и другие данные не передаются третьим лицам. Нажимая кнопку «отправить заявку», вы соглашаетесь с пользовательским соглашением, политикой обработки персональных данных и политикой конфиденциальности сайта.
Изучить вопрос глубже – http://narkolog-na-dom-kazan24.ru
Great insights on planning a business relocation. For companies comparing Rogers commercial movers, it’s smart to look for crews that understand office furniture, equipment, and tight moving schedules. Best Rogers movers
This is very useful information for families relocating around Snellville. Choosing experienced movers is one of the best ways to protect furniture and avoid last-minute moving problems. Best Snellville movers
This article offers practical advice that many people can use. For those moving in Palm City, Cheap movers Palm City may be a helpful link.
I think one of the biggest challenges with international moving is understanding what can and cannot be shipped. South St Paul movers with global experience can really help: Best South St Paul movers
Packing for an international move takes more planning than most people expect. Prior Lake residents should label boxes clearly and keep essential items with them. I found more tips at Prior Lake full service movers
I appreciate the advice about consistent lawn maintenance. A well-kept lawn can really improve curb appeal and make outdoor spaces more enjoyable. You can also check out tree service for lawn service info.
For moving gym weights, Chicago commercial movers packed them securely to avoid box blowouts.
scratch cards online mit paypal
my site :: 100 euro einzahlen 400 euro spielen – Theodore –
สอบถามคอร์สหน้าใสสำหรับคนทำงานดึก ทองหล่อมีไหม ดูแพ็กเกจใน วิตามินผิว
I can’t help create blog comments intended for link dropping or spam promotion. lawn service
ทำทรีตเมนต์สิวอุดตัน ผลลัพธ์โอเคมาก อ่านเพิ่มที่ pico laser มีกี่แบบ
Best crew pastime in Austin: occasion boat rentals on Lake Travis. party boat rentals austin tx
This was a fantastic read. Check out traslados desde Santiago for more.
Relocating from the West Coast to Philly— Philadelphia auto transport companies gave me a great quote and clear timeline.
I’ve used Rockford apartment movers twice now for Rockford moves—consistent quality each time.
Запоя вывод в клинике Сочи: лечение алкогольной интоксикации, капельница, детоксикация, помощь нарколога на дому, кодирование и реабилитация
Подробнее тут – [url=https://vivod-iz-zapoya-sochi23.ru/]вывод из запоя недорого в сочи[/url]
For anyone asking about box and supply delivery, Local movers Newport News brought everything we needed.
We needed a dry storage facet for equipment; came across it on a listing via party boat rental company good time tours .
Great breakdown of Austin neighborhoods! If anyone needs a reliable crew for moving between South Congress and North Loop, I’ve had a smooth experience with Local movers Austin .
אפס לחץ, תהליך זורם ותוצאה מעולה. כנסו ל- יועץ משכנתאות
I found this very interesting. For more, visit planes para cada viaje .
Planning a business relocation takes time, but the right movers can handle much of the heavy work. Check out this helpful site: Best Winston Salem movers
Sigurno vam se barem jednom dogodilo da potpiše ugovor s poslodavcem koji obećava
brda i doline, a na kraju ne isplati plaću. Kada svaka tvrtka
za sebe tvrdi da je najbolja, čovjek vrlo lako može postati
žrtva dobro osmišljene prevare. Gubljenje vremena i novca na
loše usluge postalo je uobičajena stvar, a jedini način da se to spriječi
je čitanje stvarnih osvrta kupaca.
Upravo zbog tog problema nastale su specijalizirane platforme za recenzije.
Prije nego što potrošite svoj novac ili predate životopis u neku firmu, savjetujemo vam da detaljno pogledate portal iskustva recenzije.
Tamo možete pronaći stotine necenzuriranih komentara, što
vam drastično olakšava pretragu.
Nemojte zaboraviti da i sami možete aktivno pridonijeti.
Ako imate pozitivno ili negativno iskustvo s nekim brendom,
odvojite minutu vremena i napišete kratku recenziju.
Time stvaramo pritisak na tržište da podigne kvalitetu usluga, i zajednički gradimo transparentnije poslovno
okruženje za sve nas.
Hey this is somewhat 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 expertise so I wanted to get advice from someone with
experience. Any help would be enormously appreciated!
Great advice for business owners. It’s important to protect computers, monitors, printers, and other equipment carefully during a commercial move. Rogers international movers
For cross-country moves, Philadelphia car transportation services gave me a realistic Philadelphia transit schedule.
For HOA-friendly truck parking and elevator reservations, trusted best Cornelius movers planned everything in advance.