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
}
Got rid of a blown-engine pickup today— sell my broken car Fort Myers FL handled towing and paid more than scrap value.
другие [url=https://trip71.us/]трипскан вход[/url]
Thanks a bunch for sharing this with all people you really recognize what you’re talking approximately! Bookmarked. Kindly also discuss with my website =). We could have a link change contract among us
casino retrait immediat
This is quite enlightening. Check out emergency plumbers for more.
Appreciate the thorough insights. For more, visit emergency plumbers .
Useful advice! For more, visit carpintería de aluminio A Coruña .
My HOA is cracking down on project cars. Scheduling a weekend pickup—anyone booked Saturday slots with sell my junk car for cash Venice FL successfully?
Hey there, I think your blog might be having browser compatibility issues. When I look at your blog site in Opera, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, terrific blog!
casino retrait immediat
В этой публикации мы рассматриваем важную тему борьбы с зависимостями, включая алкогольную и наркотическую зависимости. Мы обсудим методы лечения, реабилитации и поддержку, которые могут помочь людям, столкнувшимся с этой проблемой. Читатели узнают о перспективах выздоровления и важности комплексного подхода.
Посмотреть всё – [url=https://divolog.ru/kapelnitsa-na-domu-v-mytishhah-bezopasnyj-vyhod-iz-zapoya/]стоп алко мытищи[/url]
Attractive portion of content. I simply stumbled upon your web site and in accession capital to claim that I get actually enjoyed account your blog posts. Anyway I’ll be subscribing on your augment or even I fulfillment you access consistently rapidly.
casino retrait immediat
Excellent advice on preventing breakdowns; for AC Repair in Fayetteville, see urgent AC repair near me .
Appreciate the detailed information. For more, visit emergency plumbers .
Thanks for the valuable article. More at servicios jurídicos Santiago .
Hey there are using WordPress for your blog platform? I’m new to the blog world but I’m trying to get started and set up my own. Do you need any coding knowledge to make your own blog? Any help would be really appreciated!
casino retrait immediat
В этом обзоре мы обсудим современные методы борьбы с зависимостями, включая медикаментозную терапию и психотерапию. Мы представим последние исследования и их результаты, чтобы читатели могли быть в курсе наиболее эффективных подходов к лечению и поддержке.
Лучшее решение — прямо здесь – [url=https://yamedik.org/vrach-na-dom/v-kakih-sluchayah-nuzhen-narkolog-na-dom/]врач нарколог на дом в ростове[/url]
В статье по вопросам здоровья мы рассматриваем актуальные проблемы, с которыми сталкивается общество. Обсуждаются заболевания, факторы риска и важные аспекты профилактики. Читатели получат полезные советы о том, как сохранить здоровье и улучшить качество жизни.
Есть чему поучиться – [url=https://doccentr.com/vyvod-iz-zapoya-bezopasnost-i-effektivnost/]Похмельная служба Люберцы[/url]
Everything looks well balanced, from colors to framing. Solid real estate photography work. real estate photographer spring tx
Hey very nice blog!! Man .. Beautiful .. Superb .. I will bookmark your blog and take the feeds also? I’m satisfied to find so many helpful info right here in the put up, we’d like work out extra strategies in this regard, thank you for sharing. . . . . .
casino retrait instantane
сервис тойота в москве [url=techautoport.ru/news/sezonnoe-to-toyota-kakie-raboty-obyazatelno-vypolnyat-vesnoy-i-osenyu-dlya-nadezhnosti-avtomobilya.html]techautoport.ru/news/sezonnoe-to-toyota-kakie-raboty-obyazatelno-vypolnyat-vesnoy-i-osenyu-dlya-nadezhnosti-avtomobilya.html[/url]
В этой публикации мы исследуем ключевые аспекты здоровья, включая влияние образа жизни на благополучие. Читатели узнают о важности правильного питания, физической активности и психического здоровья. Мы предоставим практические советы и рекомендации для поддержания здоровья и развития профилактических подходов.
Ознакомиться с полной информацией – [url=https://www.wpdis.co/reabilitatsiya-narkozavisimyih-i-sotsialnoe-vosstanovlenie/]Похмельная служба в Москве[/url]
These organization hacks are gold. For hauling, waste removal in Sydney is worth a look.
This was quite helpful. For more, visit emergency plumber .
This was nicely structured. Discover more at plumber .
Thanks , I have recently been looking for info approximately this subject for a long time and yours is the greatest I have came upon so far. However, what in regards to the conclusion? Are you sure about the source?
casino retrait immediat
Вызов нарколога на дом в Каменске-Уральском обеспечивает безопасность пациента, исключая необходимость посещения медицинского учреждения, что особенно актуально при тяжелом состоянии или психологическом сопротивлении. Такая помощь включает в себя детоксикацию, купирование абстинентного синдрома и консультации по дальнейшему лечению.
Получить дополнительные сведения – [url=https://narkolog-na-dom-kamensk-uralskij11.ru/]частный нарколог на дом[/url]
Эта статья подробно расскажет о процессе выздоровления, который включает в себя эмоциональную, физическую и психологическую реабилитацию. Мы обсуждаем значимость поддержки и наличие профессиональных программ. Читатели узнают, как строить новую жизнь и не возвращаться к старым привычкам.
Узнать из первых рук – [url=https://www.medkursor.ru/other_about_health/zapiski/20939.html]Похмельная служба в Анапе[/url]
Hey there are using WordPress for your site platform? I’m new to the blog world but I’m trying to get started and create my own. Do you require any coding expertise to make your own blog? Any help would be greatly appreciated!
casino en ligne retrait instantane
Appreciate the tip to ask for ETA texts. My hauler from local roll off rentals texted 30 minutes out.
Aw, this was a very nice post. Taking a few minutes and actual effort to make a very good article… but what can I say… I procrastinate a whole lot and don’t seem to get nearly anything done.
casino en ligne retrait instantane
Hi everybody, here every one is sharing these kinds of experience, therefore it’s fastidious to read this web site, and I used to pay a visit this webpage everyday.
casino retrait immediat
I blog frequently and I really appreciate your content. The article has really peaked my interest. I will bookmark your website and keep checking for new information about once per week. I subscribed to your Feed too.
casino en ligne retrait instantane
I was able to find good info from your articles.
casino en ligne retrait instantane
В этой публикации мы обсуждаем современные методы лечения различных заболеваний. Читатели узнают о новых медикаментах, терапиях и исследованиях, которые активно применяются для лечения. Мы нацелены на то, чтобы предоставить практические знания, которые могут помочь в борьбе с недугами.
Узнай первым! – [url=https://nashmed.cx.ua/kak-brosyt-pyt-bez-postoronnej-pomoshhy.html]стоп алко екатеринбург[/url]
Lightning knocked out my contactor. air conditioning repair service replaced it and suggested surge protection in Tampa.
I importance the tick list for annual roof care. roofer company estimate gives a protection plan that’s least expensive.
The explanation of ice/water preserve used to be correct. I delivered it to valleys thru roof replacement company .
For anyone with HOA standards to meet, lawn care tips offered recurring inspections to keep common areas weed-free without over-spraying.
Nice advice. For rodent control specialists in LA, contact rodent control .
Hello there! Do you know if they make any plugins to assist with SEO? I’m trying to get my blog to rank for some targeted keywords but I’m not seeing very good gains. If you know of any please share. Many thanks!
casino retrait instantane
При острых интоксикациях, абстинентных синдромах или тяжелых состояниях, вызванных злоупотреблением алкоголем или наркотическими веществами, каждая минута играет роль. Нарколог на дом в клинике «БалтикМед» приезжает с необходимым оборудованием и медикаментами для стабилизации состояния, проведения инфузионной терапии и профилактики осложнений. Это позволяет избежать транспортировки пациента в критическом состоянии и сократить время начала лечения.
Углубиться в тему – http://narcolog-na-dom-kaliningrad00.ru
What’s up to all, the contents present at this web page are truly remarkable for people knowledge, well, keep up the nice work fellows.
casino retrait immediat
Excellent website you have here but I was curious about if you knew of any user discussion forums that cover the same topics discussed in this article? I’d really love to be a part of community where I can get suggestions from other experienced people that share the same interest. If you have any suggestions, please let me know. Thanks!
casino en ligne retrait instantane
Wow that was strange. I just wrote an incredibly long comment but after I clicked submit my comment didn’t appear. Grrrr… well I’m not writing all that over again. Anyways, just wanted to say excellent blog!
casino en ligne retrait immediat
whoah this weblog is wonderful i really like reading your posts. Stay up the good work! You recognize, many individuals are looking around for this information, you could aid them greatly.
casino en ligne retrait instantane
https://lavita-clinik.ru/kosmetologija/chto-takoe-ozhog-ot-lazernoj-jepiljacii-foto
This is highly informative. Check out plumbers for more.
WOW just what I was looking for. Came here by searching for %keyword%
casino retrait instantane
Well explained. Discover more at emergency plumber .
You can really see the layout clearly. That makes a big difference when browsing property photos. real estate photography spring tx
В этой статье мы обсудим процесс восстановления после зависимостей, акцентируя внимание на различных методах и подходах к реабилитации. Читатели узнают, как создать план выздоровления и использовать полезные ресурсы для достижения устойчивых изменений.
Читать далее > – [url=http://medobook.ru/load/medicina/stati/kak_vyzvat_narkologa_na_dom/49-1-0-6465]стоп алко москва[/url]