Man page - cgroups(7)

Packages contains this manual

Available languages:

en fr sv ru

Manual

cgroups

NAMN
BESKRIVNING
Terminologi
Cgroups version 1 och version 2
CGROUPS VERSION 1
Uppgifter (trÄdar) respektive processer
Montering av v1-hanterare
Avmontering av v1-hanterare
Cgroup version 1-hanterare
Att skapa styrgrupper och flytta processer
Att ta bort styrgrupper
Cgroups v1 notifieringar om slÀpp
Cgroup v1 namngivna hierarkier
CGROUPS VERSION 2
Cgroups v2 sammanslagen hierarki
Cgroups v2 monteringsflaggor
Cgroups v2-hanterare
Cgroups v2 undertrÀdsstyrning
Cgroups v2-regeln "inga interna processer"
Cgroups v2 fil cgroup.events
Cgroup v2 slÀppnotifieringar
Cgroups v2 filen cgroup.stat
BegrÀnsning av antalet avkommestyrgrupper
STYRGRUPPSDELEGERING: ATT DELEGERA EN HIERARKI TILL EN MINDRE PRIVILEGIERADANVÄNDARE
Cgroups v2-delegering: nsdelegate och styrgruppsnamnrymder
Inneslutningsregler för styrgruppsdelegering
CGROUPS VERSION 2 TRÅDLÄGE
TrÄdade hanterare kontra domÀnhanterare
Att skapa ett trÄdat undertrÀd
Att anvÀnda ett trÄdat undertrÀd
Regler för att skriva till cgroup.type och att skapa trÄdade undertrÀd
Styrgruppstypen "domÀn trÄdad"
Undantag för rotstyrgruppen
Hanteraren "cpu" i cgroups v2 och realtidstrÄdar
FEL
NOTERINGAR
/proc-filer
/sys/kernel/cgroup-filer
SE ÄVEN
ÖVERSÄTTNING

NAMN

cgroups — Linux styrgrupper

BESKRIVNING

Styrgrupper, vanligen refererade till som cgroups, Àr en funktion i LinuxkÀrnan som gör att processer kan organiseras i hierarkiska grupper vars anvÀndning av olika typer av resurser sedan kan begrÀnsas och övervakas. KÀrnans cgroup-grÀnssnitt tillhandahÄlls via ett pseudofilsystem som kallas cgroupfs. Gruppering implementeras i kÀrnans centrala cgroup-kod, medan resursspÄrning och -begrÀnsning implementeras i ett antal undersystem per resurstyp (minne, CPU, och sÄ vidare).

Terminologi

En cgroup Àr en samling av processer som Àr bundna av en uppsÀttning grÀnser eller parametrar som definieras via cgroup-filsystemet.

Ett undersystem Àr en kÀrnkomponent som modifierar beteendet hos processerna i en cgroup. Olika undersystem har implementerats, vilket gör det möjligt att göra saker som att begrÀnsa mÀngden CPU-tid och minne som Àr tillgÀngligt i en cgroup, bokföring av CPU-tiden som anvÀnds av en cgroup och frysning och Äterupptagande av körningen av processerna i en cgroup. Undersystem Àr ocksÄ ibland kÀnda som resurshanterare ( resource controllers ) (eller helt enkelt, hanterare ( controllers )).

En hanterares cgroups Àr arrangerade i en hierarki . Denna hierarki defineras genom att skapa, ta bort och byta namn pÄ underkataloger i cgroup-filsystemet. PÄ varje nivÄ av hierarkin kan attribut (t.ex., grÀnser) definieras. GrÀnserna, styrningen och bokföringen som erbjuds av cgroups har allmÀnt sett pÄverkan genom underhierarkin under den cgroup dÀr attributen definieras. AlltsÄ kan till exempel inte grÀnserna som placeras pÄ en cgroup pÄ en högre nivÄ i hierarkin överskridas av avkomme-cgroups.

Cgroups version 1 och version 2

Den ursprungliga utgÄvan av cgroups-implementationen var i Linux 2.6.24. Med tiden har olika cgroup-hanterare lagts till för att möjliggöra hanteringen av olika typer av resurser. Dock var utvecklingen av dessa hanterare i stort sett okoordinerad, med resultatet att mÄnga inkonsistenser uppstod mellan hanterare och anvÀndandet av cgroup-hierarkier blev ganska komplext. En lÀngre beskrivning av dessa problem finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v2.rst (eller Documentation/cgroup-v2.txt i Linux 4.17 och tidigare).

PĂ„ grund av problemen med den ursprungliga cgroups-implementationen (cgroups version 1) inleddes, med början i Linux 3.10, arbete pĂ„ en ny, ortogonal implementation för att Ă„tgĂ€rda dessa problem. FrĂ„n början markerad experimentell, och dold bakom monteringsflaggan -o __DEVEL__sane_behavior gjordes den nya versionen (cgroups version 2) slutligen officiell i och med utgĂ„van av Linux 4.5. Skillnader mellan de tvĂ„ versionerna beskrivs i texten nedan. Filen cgroup.sane_behavior , som finns i cgroups v1, Ă€r en relik frĂ„n denna monteringsflagga. Filen rapporterar alltid ”0” och finns bara kvar för bakĂ„tkompatibilitet.

Även om cgroups v2 Ă€r avsett att vara en ersĂ€ttning för cgroups v1 finns det Ă€ldre systemet kvar (och av kompatibilitetsskĂ€l Ă€r det osannolikt att det kommer tas bort). För nĂ€rvarande implementerar cgroups v2 endast en delmĂ€ngd av hanterarna som Ă€r tillgĂ€ngliga i cgroups v1. De tvĂ„ systemen Ă€r implementerade sĂ„ att bĂ„de v1-hanterare och v2-hanterare kan monteras pĂ„ samma system. AlltsĂ„ Ă€r det till exempel möjligt att anvĂ€nda de hanterare som stödjs under version 2, men ocksĂ„ anvĂ€nda version 1-hanterare dĂ€r version 2 Ă€nnu inte stödjer dessa hanterare. Den enda begrĂ€nsningen Ă€r att en hanterare inte samtidigt kan anvĂ€ndas i bĂ„de en cgroups v1-hierarki och i cgroups v2-hierarkin.

CGROUPS VERSION 1

Under cgroups v1 kan varje hanterare monteras mot ett separat cgroup-filsystem som ger sin egen hierarkiska organisation av processerna pÄ systemet. Det Àr ocksÄ möjligt att sammontera flera (eller alla) cgroups v1-hanterare mot samma cgroup-filsystem, vilket betyder att de sammonterade hanterarna anvÀnder samma hierarkiska organisation av processer.

För varje monterad hierarki avspeglar katalogtrÀdet styrgruppshierarkin. Varje styrgrupp representeras av en katalog, dÀr var och en av dess barnstyr-cgroup representeras av en barnkatalog. Till exempel representerar /user/johan/1.session styrgruppen 1.session , vilken Àr ett barn till johan , vilken Àr ett barn till /user . Under varje cgroup-katalog finns en uppsÀttning filer vilka kan lÀsas eller skrivas till, vilket avspeglar resursbegrÀnsningar och nÄgra allmÀnna cgroup-egenskaper.

Uppgifter (trÄdar) respektive processer

I cgroups v1 dras en distinktion mellan processer och uppgifter . I denna vy kan en process bestÄ av flera uppgifter (oftare kallade trÄdar, frÄn ett anvÀndarperspektiv, och kallas sÄ i resten av denna manualsida). I cgroups v1 Àr det möjligt att hantera cgroup-medlemskapet hos trÄdarna i en process oberoende av varandra.

Cgroups v1 möjlighet att dela trĂ„dar över olika cgroups orsakade problem i en del fall. Till exempel var det inte meningsfullt för minnes hanteraren eftersom alla trĂ„darna i en process delar en enda adressrymd. PĂ„ grund av dessa problem togs möjlighetn att oberoende hantera cgroup-medlemskapet hos trĂ„dar i en process bort i den ursprungliga cgroups v2-implementationen, och Ă„terstĂ€lldes senare i en mer begrĂ€nsad form (se diskussionen om ”trĂ„dlĂ€ge” nedan).

Montering av v1-hanterare

AnvÀndningen av cgroups förutsÀtter en kÀrna byggd med alternativet CONFIG_CGROUP . Dessutom har var och en av v1-hanterarna ett associerat konfigurationsalternativ som mÄste vara satt för att anvÀnda den hanteraren.

För att anvÀnda en v1-hanterare mÄste den monteras mot ett cgroup-filsystem. Den vanliga platsen för sÄdana monteringar Àr under ett tmpfs (5)-filsystem monterat pÄ /sys/fs/cgroup . Man kan alltsÄ montera cpu -hanteraren enligt följande:

mount -t cgroup -o cpu none /sys/fs/cgroup/cpu

Det Àr möjligt att sammontera flera hanterare mot samma hierarki. Till exempel sammonteras hÀr hanterarna cpu och cpuacct mot en enda hierarki:

mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct

Sammontering av hanterare har effekten att en process Àr i samma cgroup för alla sammonterade hanterare. Separat monterade hanterare gör det möjligt för en process att finnas i en cgroup /apa1 för en hanterare medan den finns i /apa2/apa3 för en annan.

Det Àr möjligt att sammontera alla v1-hanterare mot samma hierarki:

mount -t cgroup -o all cgroup /sys/fs/cgroup

(Man kan Ästadkomma samma resultat genom att utelÀmna -o all eftersom det Àr standardbeteendet om inga hanterare uttryckligen anges.)

Det Àr inte möjligt att montera samma hanterare mot flera cgroup-hierarkier. Till exempel Àr det inte möjligt att montera bÄde hanteraren cpu och cpuacct mot en hierarki, och att montera hanteraren cpu ensam mot en annan hierarki. Det Àr möjligt att skapa flera monteringar med exakt samma uppsÀttning av sammonterade hanterare. I det fallet Àr dock det enda som hÀnder att flera monteringspunkter ger en vy av samma hierarki.

Observera att pÄ mÄnga system Àr v1-hanterarna automatiskt monterade under /sys/fs/cgroup ; speciellt skapar systemd (1) automatiskt sÄdana monteringar.

Avmontering av v1-hanterare

Ett monterat cgroup-filsystem kan avmonteras med kommandot umount (8), som i följande exempel:

umount /sys/fs/cgroup/pids

Men observera Àven : ett cgroup-filsystem avmonteras bara om det inte Àr upptaget, det vill sÀga att det inte har nÄgon barn-cgroup. Om det inte Àr fallet Àr enda effekten av umount (8) att göra monteringen osynlig. AlltsÄ mÄste man för att sÀkerstÀlla att en montering verkligen tas bort först ta bort alla barn-cgroup:er, vilket i sin tur endast kan göras efter att alla medlemsprocesser har flyttats ifrÄn dessa cgroup:er till root-cgroup:en.

Cgroup version 1-hanterare

Varje hanterare i cgroup version 1 styrs av ett kÀrnkonfigurationsalternativ (upprÀknat nedan). Dessutom styrs tillgÀngligheten av funktionen cgroup av kÀrnkonfigurationsalternativet CONFIG_CGROUPS .
cpu
(frÄn Linux 2.6.24; CONFIG_CGROUP_SCHED )

Cgroups kan garanteras ett minsta antal ”CPU-andelar” nĂ€r ett system Ă€r belastat. Detta begrĂ€nsar inte en cgroup:s CPU-anvĂ€ndning om CPU:erna inte Ă€r belastade. För ytterligare information, se Documentation/scheduler/sched-design-CFS.rst (eller Documentation/scheduler/sched-design-CFS.txt i Linux 5.2 och tidigare).

I Linux 3.2 utökades denna styrgrupp till att tillandahĂ„lla styrning av ”CPU-bandbredd”. Om kĂ€rnan konfigureras med CONFIG_CFS_BANDWIDTH Ă€r det, inom varje schemalĂ€ggningsperiod (definierad via en fil i cgroup-katalogen), möjligt att definiera en övre grĂ€ns pĂ„ CPU-tiden som tilldelas till processer i en cgroup. Denna övre grĂ€ns gĂ€ller Ă€ven om det inte finns nĂ„gon annan konkurrens om CPU:n. Ytterligare information finns i kĂ€rnans kĂ€llfil Documentation/scheduler/sched-bwc.rst (eller Documentation/scheduler/sched-bwc.txt i Linux 5.2 och tidigare).

cpuacct (sedan Linux 2.6.24; CONFIG_CGROUP_CPUACCT )

Denna tillhandahÄller bokföring av CPU-anvÀndning av grupper av processer.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/cpuacct.rst (eller Documentation/cgroup-v1/cpuacct.txt i Linux 5.2 och tidigare).

cpuset (sedan Linux 2.6.24; CONFIG_CPUSETS )

Denna cgroup kan anvÀndas för att binda processerna i en cgroup till en specifik uppsÀttning av CPU:er och NUMA-noder.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/cpusets.rst (eller Documentation/cgroup-v1/cpusets.txt i Linux 5.2 och tidigare).

memory (sedan Linux 2.6.25; CONFIG_MEMCG )

Minneshanteraren stödjer rapportering och begrÀnsning av processminne, kÀrnminne och vÀxling som anvÀnds av cgroup:er.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/memory.rst (eller Documentation/cgroup-v1/memory.txt i Linux 5.2 och tidigare).

devices (sedan Linux 2.6.26; CONFIG_CGROUP_DEVICE )

Detta stödjer styrning av vilka processer som fÄr skapa (mknod) enheter liksom öppna dem för lÀsning eller skrivning. Policyerna kan anges som tillÄtelselistor och nekandelistor. Hierarkin upprÀtthÄlls, sÄ att nya regler inte fÄr bryta mot befintliga regler för mÄlet eller anfader-cgroup:er.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/devices.rst (eller Documentation/cgroup-v1/devices.txt i Linux 5.2 och tidigare).

freezer (sedan Linux 2.6.28; CONFIG_CGROUP_FREEZER )

Cgroup:en freezer kan försÀtta alla processer i en cgroup i vÀntelÀge (suspend) och Äteruppta (resume) dem. Att frysa en cgroup /A fÄr Àven dess barn, till exempel processer i /A/B , att frysas.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/freezer-subsystem.rst (eller Documentation/cgroup-v1/freezer-subsystem.txt i Linux 5.2 och tidigare).

net_cls (sedan Linux 2.6.29; CONFIG_CGROUP_NET_CLASSID )

Denna lÀgger ett klass-id, angivet för cgroup:en, pÄ nÀtverkspaket som skapas av en cgroup. Dessa klass-id:n kan sedan anvÀndas i brandvÀggsregler, liksom anvÀndas för att forma trafiken med tc (8). Detta gÀller endast paket som lÀmnar cgroup:en, inte trafik som kommer till cgroup:en.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/net_cls.rst (eller Documentation/cgroup-v1/net_cls.txt i Linux 5.2 och tidigare).

blkio (sedan Linux 2.6.33; CONFIG_BLK_CGROUP )

Cgroup:en blkio styr och begrÀnsar Ätkomst till angivna blockenheter genom att lÀgga pÄ IO-styrning i form av strypning och övre grÀnser pÄ lövnoder och mellanliggande noder i lagringshierarkin.

TvÄ policyer Àr tillgÀngliga. Den första Àr med proportionell vikt tidsbaserad uppdelning av disk implementerad med CFQ. Denna Àr i kraft för lövnoder som anvÀnder CFQ. Den andra Àr en strypningspolicy som anger övre grÀnser för I/O-hastighet för en enhet.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/blkio-controller.rst (eller Documentation/cgroup-v1/blkio-controller.txt i Linux 5.2 och tidigare).

perf_event (sedan Linux 2.6.39; CONFIG_CGROUP_PERF )

Denna hanterare medger perf -övervakning av uppsÀttningen processer som Àr grupperade i en cgroup.

Ytterligare information finns i kÀrnans kÀllfiler

net_prio (sedan Linux 3.3; CONFIG_CGROUP_NET_PRIO )

Denna tillÄter att prioriteter anges, per nÀtverksgrÀnssnitt, för cgroup:er.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/net_prio.rst (eller Documentation/cgroup-v1/net_prio.txt i Linux 5.2 och tidigare).

hugetlb (sedan Linux 3.5; CONFIG_CGROUP_HUGETLB )

Denna stödjer att man begrÀnsar anvÀndningen av vÀldiga sidor med styrgrupper.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/hugetlb.rst (eller Documentation/cgroup-v1/hugetlb.txt i Linux 5.2 och tidigare).

pids (sedan Linux 4.3; CONFIG_CGROUP_PIDS )

Denna hanterare tillÄter att man begrÀnsar antalet processer som kan skapas i en styrgrupp (och dess avkommor).

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/pids.rst (eller Documentation/cgroup-v1/pids.txt i Linux 5.2 och senare).

rdma (sedan Linux 4.11; CONFIG_CGROUP_RDMA )

RDMA-hanteraren tillÄter att man begrÀnsar anvÀndningen av RDMA/IB-specifika resurser per styrgrupp.

Ytterligare information finns i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v1/rdma.rst (eller Documentation/cgroup-v1/rdma.txt i Linux 5.2 och tidigare).

Att skapa styrgrupper och flytta processer

Ett styrgruppfilsystem innehĂ„ller initialt en ensam rotstyrgrupp, ”/”, vilken alla processer hör till. En ny styrgrupp skapas genom att skapa en katalog i styrgruppfilsystemet:

mkdir /sys/fs/cgroup/cpu/sg1

Detta skapar en ny tom styrgrupp.

En process kan flyttas till denna styrgrup genom att skriva dess PID in i styrgruppens fil cgroup.procs :

echo $$ > /sys/fs/cgroup/cpu/sg1/cgroup.procs

Endast en PID Ät gÄngen fÄr skrivas till denna fil.

Om man skriver vÀrdet 0 till en fil cgroup.procs flyttas den skrivande processen till motsvarande styrgrupp.

NÀr man skriver ett PID in i cgroup.procs flyttas alla trÄdar i processen in i den nya styrgruppen pÄ en gÄng.

Inom en hierarki kan en process vara medlem av precis en styrgrupp. NÀr man skriver en process PID till en fil cgroup.procs tas den automatiskt bort frÄn den styrgrupp den var medlem av tidigare.

Filen cgroup.procs kan lÀsas för att hÀmta en lista pÄ processer som Àr medlemmar av en styrgrupp. Den returnerade listan av PID:er Àr inte garanterat i ordning. Inte heller Àr den garanterat fri frÄn upprepningar. (Till exempel kan ett PID ha blivit ÄteranvÀnt medan listan lÀstes.)

I cgroups v1 kan en enskild trÄd flyttas till en annan styrgrupp genom att skriva dess trÄd-ID (d.v.s., kÀrnans trÄd-ID returnerat frÄn clone (2) och gettid (2)) till filen tasks i en styrgruppskatalog. Denna fil kan lÀsas för att se uppsÀttningen av trÄdar som Àr medlemmar av styrgruppen.

Att ta bort styrgrupper

För att ta bort en styrgrupp fÄr den först inte ha nÄgra barnstyrgrupper och inte innehÄlla nÄgra processer (andra Àn zombier). Förutsatt att det Àr fallet kan man helt enkelt ta bort motsvarande katalogsökvÀg. Observera att filer i en styrgruppskatalog inte kan och inte behöver tas bort.

Cgroups v1 notifieringar om slÀpp

TvÄ filer kan anvÀndas för att avgöra huruvida kÀrnan skall tillhandahÄlla notifieringar nÀr en styrgrupp blir tom. En styrgrupp anses tom nÀr den inte innehÄller nÄgra barnstyrgrupper och inga medlemsprocesser.

En speciell fil i rotkatalogen av varje styrgruppshierarki, release_agent , kan anvÀndas för att registrera sökvÀgsnamnet till ett program som kan anropas nÀr en styrgrupp i hierarkin blir tom. SökvÀgen till den nyss tömda styrgruppen (relativt monteringspunkten för styrgrupper) ges som det enda kommandoradsargumentet nÀr programmet release_agent anropas. Programmet release_agent kan ta bort styrgruppskatalogen, eller kanske Äterpopulera den med en process.

StandardvÀrdet i filen release_agent Àr tomt, vilket betyder att ingen slÀppagent anropas.

InnehÄllet i filen release_agent kan ocksÄ anges via en monteringsflagga nÀr styrgruppsfilsystemet monteras:

mount -o release_agent=sökvĂ€g 


Huruvida programmet release_agent anropas eller inte nÀr en viss styrgrupp blir tom avgörs av vÀrdet i filen notify_on_release i motsvarande styrgruppskatalog. Om denna fil innehÄller vÀrdet 0, dÄ anropas inte programmet release_agent . Om den innehÄller vÀrdet 1 anropas programmet release_agent . StandardvÀrdet i denna fil i rotstyrgruppen Àr 0. NÀr en ny styrgrupp skapas Àrvs vÀrdet i denna fil frÄn motsvarande fil i förÀldrastyrgruppen.

Cgroup v1 namngivna hierarkier

I cgroups v1 Àr det möjligt att montera en styrgruppshierarki som inte har nÄgra tillkopplade hanterare:

mount -t cgroup -o none,name=ngtnamn none /nÄgon/monterings/punkt

Flera instanser av sÄdana hierarkier kan monteras; varje hierarki mÄste ha ett unikt namn. Det enda syftet med sÄdana hierarkier Àr att spÄra processer. (Se diskussionen om slÀppnotifieringar nedan.) Ett exempel pÄ detta Àr styrgruppshierarkin name=systemd som anvÀnds av systemd (1) för att spÄra tjÀnster och anvÀndarsessioner.

Sedan Linux 5.0 kan kÀrnans uppstartsflagga cgroup_no_v1 (beskriven nedan) anvÀndas till att avaktivera namngivna hierarkier inom cgroup v1, genom att ange cgroup_no_v1=namngiven .

CGROUPS VERSION 2

I cgroups v2 bor alla monterade hanterare i en enda sammanslagen hierarki. Även om (olika) hanterare kan monteras samtidigt under v1- och v2-hierarkierna Ă€r det inte möjligt att montera samma hanterare samtidigt under bĂ„de v1- och v2-hierarkierna.

De nya beteendena i cgroups v2 sammanfattas hÀr, och utvecklas i nÄgra fall i de följande underavsnitten.

‱

Cgroups v2 tillhandahÄller en sammanslagen hierarki mot vilken alla hanterare monteras.

‱

”Interna” processer Ă€r inte tillĂ„tna. Med undantag av rotstyrgruppen kan processer endast finnas i lövnoder (styrgrupper som inte sjĂ€lva innehĂ„ller barnstyrgrupper). Detaljerna Ă€r nĂ„got mer subtila Ă€n detta, och beskrivs nedan.

‱

Aktiva styrgrupper mÄste anges via filerna cgroup.controllers och cgroup.subtree_control .

‱

Filen tasks har tagits bort. Dessutom har filen cgroup.clone_children som anvÀnds i hanteraren cpuset tagits bort.

‱

En förbÀttrad mekanism för notifieringar om tomma styrgrupper ges av filen cgroup.events .

För fler Àndringar, se filen Documentation/admin-guide/cgroup-v2.rst i kÀrnans kÀlla (eller Documentation/cgroup-v2.txt i Linux 4.17 och tidigare).

NĂ„gra av de nya beteendena ovan modifierades senare med tillĂ€gget i Linux 4.14 av ”trĂ„dlĂ€ge” (beskrivet nedan).

Cgroups v2 sammanslagen hierarki

I cgroups v1 var möjligheten att montera olika hanterare mot olika hierarkier avsedd att ge en stor flexibilitet i designen av program. I praktiken visade sig dock flexibiliteten vara mindre anvÀndbar Àn förvÀntat, och i mÄnga fall lade den till komplexitet. DÀrför monteras i cgroups v2 alla tillgÀngliga hanterare mot en enda hierarki. De tillgÀngliga hanterarna monteras automatiskt, vilket betyder att det inte Àr nödvÀndigt (eller möjligt) att ange hanterarna nÀr man monterar filsystemet för cgroups v2 med ett kommando som det följande:

mount -t cgroup2 none /mnt/cgroup2

En hanterare i cgroup v2 Àr tillgÀnglig endast om den inte för nÀrvarande anvÀnds via en montering mot en cgroup v1-hierarki. Eller, för att uttrycka det pÄ ett annat sÀtt, Àr det inte möjligt att anvÀnda samma hanterare mot bÄde en v1-hierarki och den sammanslagna v2-hierarkin. Detta betyder att det kan vara nödvÀndigt att först avmontera en v1-hanterare (som beskrivet ovan) före den hanteraren Àr tillgÀnglig i v2. Eftersom systemd (1) normalt anvÀnder sig mycket av nÄgra v1-hanterare kan det i nÄgra fall vara enklare att starta med de valda v1-hanterarna avaktiverade. För att göra detta, ange flaggan cgroup_no_v1=lista pÄ kÀrnans startkommandorad; lista Àr en kommaseparerad lista av namnen pÄ hanterare att avaktivera, eller ordet all för att avaktivera alla v1-hanterare. (Denna situation hanteras korrekt av systemd (1) som faller tillbaka pÄ att arbeta utan de angivna hanterarna.)

Observera att pÄ mÄnga moderna system monterar systemd (1) automatiskt filsystemet cgroup2 pÄ /sys/fs/cgroup/unified under uppstartsprocessen.

Cgroups v2 monteringsflaggor

Följande flaggor ( mount -o ) kan anges vid montering av cgroup v2-filsystemet:
nsdelegate
(sedan Linux 4.15)

Behandla styrgruppsnamnrymder som delegeringsgrÀnser. För detaljer se nedan.

memory_localevents (sedan Linux 5.2)

memory.events skall visa statistik endast för styrgruppen sjÀlv, och inte för nÄgra avkommestyrgrupper. Detta var beteendet före Linux 5.2. Med början i Linux 5.2 Àr standardbeteendet att inkludera statistik för avkommestyrgrupper i memory.events , och denna monteringsflagga kan anvÀndas för att ÄtergÄ till det tidigare beteendet. Denna flagga Àr systemvid och kan anges vid monteringar eller Àndras genom ommonteringar endast frÄn den intiala monteringsnamnrymden; den ignoreras tyst i andra namnrymder Àn den initiala.

Cgroups v2-hanterare

Följande hanterare, dokumenterade i kÀrnans kÀllfil Documentation/admin-guide/cgroup-v2.rst (eller Documentation/cgroup-v2.txt i Linux 4.17 och tidigare), stödjs i styrgrupper version 2:
cpu
(sedan Linux 4.15)

Detta Àr efterföljaren till hanterarna cpu och cpuacct i version 1.

cpuset (sedan Linux 5.0)

Detta Àr efterföljaren till hanteraren cpuset i version 1.

freezer (sedan Linux 5.2)

Detta Àr efterföljaren till hanteraren freezer i version 1.

hugetlb (sedan Linux 5.6)

Detta Àr efterföljaren till hanteraren hugetlb i version 1.

io (sedan Linux 4.5)

Detta Àr efterföljaren till hanteraren blkio i version 1.

memory (sedan Linux 4.5)

Detta Àr efterföljaren till hanteraren memory i version 1.

perf_event (sedan Linux 4.11)

Detta Àr samma som hanteraren perf_event i version 1.

pids (sedan Linux 4.5)

Detta Àr samma som hanteraren pids i version 1.

rdma (sedan Linux 4.11)

Detta Àr samma som hanteraren rdma i version 1.

Det finns ingen direkt motsvarighet till hanterarna net_cls och net_prio frÄn styrgrupper version 1. IstÀllet har stöd lagts till i iptables (8) för att tillÄta eBPF-filter att haka pÄ sökvÀgar i cgroup v2 för att ta beslut om nÀtverkstrafik baserat pÄ styrgrupp.

Hanteraren devices i v2 ger inget grÀnssnitt till filer; istÀllet begrÀnsas enhetsstyrningen genom att koppla ett eBPF-program ( BPF_CGROUP_DEVICE ) till en v2-styrgrupp.

Cgroups v2 undertrÀdsstyrning

Varje styrgrupp i v2-hierarkin innehÄller följande tvÄ filer:
cgroup.controllers

Denna endast lÀsbara fil exponerar en lista av hanterarna som finns tillgÀngliga i denna styrgrupp. InnehÄllet i denna fil motsvarar innehÄllet i filen cgroup.subtree_control i förÀldrastyrgruppen.

cgroup.subtree_control

Detta Ă€r en lista över hanterare som Ă€r aktiva ( aktiverade ) i styrgruppen. UppsĂ€ttningen av hanterare i denna fil Ă€r en delmĂ€ngd av mĂ€ngden i cgroup.controllers för denna styrgrupp. UppsĂ€ttningen av aktiva hanterare modifieras genom att till denna fil skriva strĂ€ngar som innehĂ„ller blankavgrĂ€nsade hanterarnamn, vart och ett föregĂ„nget av ”+” (för att aktivera hanteraren) eller ”-” (för att avaktivera hanteraren), som i följande exempel:

echo '+pids -memory' > x/y/cgroup.subtree_control

Ett försök att aktivera en hanterare som inte finns i cgroup.controllers medför ett fel ENOENT nÀr man skriver till filen cgroup.subtree_control .

Eftersom listan av hanterare i cgroup.subtree_control Àr en delmÀngd av dem i cgroup.controllers kan en hanterare som har avaktiverats i en styrgrupp i hierarkin aldrig Äteraktiveras i undertrÀdet nedanför den styrgruppen.

En styrgrupps fil cgroup.subree_control avgör uppsÀttningen hanterare som anvÀnds i barn styrgruppen. NÀr en hanterare (t.ex., pids ) finns i filen cgroup.subtree_control i en förÀldrastyrgrupp, dÄ skapas automatiskt motsvarande hanterargrÀnssnittsfiler (t.ex., pids.max ) i barnen till den styrgruppen och kan anvÀndas för att utöva resursstyrning i barnstyrgrupperna.

Cgroups v2-regeln "inga interna processer"

Cgroups v2 upprĂ€tthĂ„ller en sĂ„ kallad ”inga interna processer”-regel. Grovt uttryckt betyder denna regel att, med undantag för rotstyrgruppen, processer endast fĂ„r bo i lövnoder (styrgrupper som inte sjĂ€lva innehĂ„ller barnstyrgrupper). Detta undviker behovet av att avgöra hur resurser skall fördelas mellan processer som Ă€r medlemmar av en styrgrupp A och processer i barnstyrgrupper till A.

Till exempel, om styrgruppen /sg1/sg2 finns, dÄ kan en process bo i /sg1/sg2 , men inte i /sg1 . Detta Àr sÄ för att undvika en tvetydighet i cgroups v1 med avseende pÄ delegationen av resurser mellan processer i /sg1 och dess barnstyrgrupper. Det rekommenderade sÀttet i cgroups v2 Àr att skapa en underkatalog som heter leaf för alla styrgrupper som inte Àr löv, vilken skall innehÄlla processer men inga barnstyrgrupper. AlltsÄ, processer vilka tidigare skulle ha hamnat i /sg1 skulle nu hamna i /sg1/leaf . Detta har fördelen att göra relationen mellan processer i /sg1/leaf och /sg1 s andra barn explicit.

Regeln om ”inga interna processer” Ă€r i verkligheten mer subtil Ă€n den uttrycks ovan. Mer exakt Ă€r regeln att en styrgrupp (annan Ă€n roten) inte bĂ„de kan (1) ha medlemsprocesser, och (2) distribuera resurser till barnstyrgrupper — det vill sĂ€ga, ha en fil cgroup.subtree_control som inte Ă€r tom. AlltsĂ„ Ă€r det möjligt för en styrgrupp att bĂ„de ha medlemsprocesser och barnstyrgrupper, men före nĂ„gra hanterare kan aktiveras för den styrgruppen mĂ„ste medlemsprocesserna flyttas ut ur styrgruppen (t.ex., kanske in i barnstyrgrupperna).

Med tillĂ€gget i Linux 4.14 av ”trĂ„dat lĂ€ge” (beskrivet nedan) har regeln om ”inga interna processer” blivit friare i nĂ„gra fall.

Cgroups v2 fil cgroup.events

Varje styrgrupp annan Àn roten i v2-hierarkin innehÄller en fil endast för lÀsning, cgroup.events , vars innehÄll Àr nyckel-vÀrde-par (begrÀnsade med nyradstecken, med nyckeln och vÀrdet separerade med blanktecken) som ger information om styrgruppen.

$ cat mingrp/cgroup.events
populated 1
frozen 0

Följande nycklar kan förekomma i denna fil:
populated

VÀrdet pÄ denna nyckel Àr antingen 1, om denna styrgrupp eller nÄgon av dess avkommor har medlemsprocesser, annars 0.

frozen (sedan Linux 5.2)

VÀrdet pÄ denna nyckel Àr 1 om denna styrgrupp för nÀrvarande Àr frusen, eller 0 om den inte Àr det.

Filen cgroup.events kan övervakas för att ta emot notifieringar nÀr vÀrdet pÄ en av dess nycklar Àndras. SÄdan övervakning kan göras med inotify (7), vilket notifierar om Àndringar som IN_MODIFY -hÀndelser, eller poll (2), vilket notifierar om Àndringar genom att returnera bitarna POLLPRI och POLLERR i fÀltet revents .

Cgroup v2 slÀppnotifieringar

Cgroups v2 tillhandahÄller en ny mekanism för att fÄ notifieringar nÀr en styrgrupp blir tom. Filerna release_agent och notify_on_release Àr borttagna, och ersatta av nyckeln populated i filen cgroup.events . Denna nyckel har antingen vÀrdet 0, vilket betyder att styrgruppen (och dess avkommor) inte innehÄller nÄgra medlemsprocesser (andra Àn zombier), eller 1, vilket betyder att styrgruppen (eller en av dess avkommor) innehÄller medlemsprocesser.

Mekanismen för slÀppnotifieringar i cgroups v2 ger följande fördelar framför mekanismen release_agent i cgroups v1:

‱

Den tillÄter billigare notifiering, eftersom en enda process kan övervaka flera cgroup.events -filer (med teknikerna som beskrivs tidigare). DÀremot medför mekanismen i cgroups v1 kostnaden i att skapa en process för varje notifiering.

‱

Notifieringar för olika underhierarkier av styrgrupper kan delegeras till andra processer. DÀremot tillÄter mekanismen i cgroups v1 endast en slÀppagent för en hel hierarki.

Cgroups v2 filen cgroup.stat

Varje styrgrupp i v2-hierarkin innehÄller en fil cgroup.stat endast för lÀsning (först introducerad i Linux 4.14) som bestÄr av rader som innehÄller nyckel-vÀrde-par. Följande nycklar finns för nÀrvarande i denna fil:
nr_descendants

Detta Àr det totala antalet synliga (d.v.s., levande) avkommestyrgrupper under denna styrgrupp.

nr_dying_descendants

Detta Àr det totala antalet döende avkommestyrgrupper under denna styrgrupp. En styrgrupp gÄr in i tillstÄndet döende efter att ha tagits bort. Den finns kvar i detta tillstÄnd under en odefinierad period (vilken kommer bero pÄ systemets last) medan resurser frigörs innan styrgruppen förstörs. Observera att förekomsten av nÄgra styrgrupper i tillstÄndet döende Àr normalt och indikerar inte nÄgot problem.

En process kan inte göras till medlem av en döende styrgrupp, och en döende styrgrupp kan inte Äterupplivas.

BegrÀnsning av antalet avkommestyrgrupper

Varje styrgrupp i v2-hierarkin innehÄller följande filer, vilka kan anvÀndas för att visa och sÀtta begrÀnsningar pÄ antalet avkommestyrgrupper under den styrgruppen:
cgroup.max.depth
(sedan Linux 4.14)

Denna fil definerar en grÀns pÄ nÀstningsdjupet för avkommestyrgrupper. VÀrdet 0 i denna fil betyder att inga avkommestyrgrupper kan skapas. Ett försök att skapa en avkomma vars nÀstningsnivÄ överskrider grÀnsen misslyckas ( mkdir (2) misslyckas med felet EAGAIN ).

Att skriva strÀngen "max" till denna fil betyder att ingen begrÀnsning görs. StandardvÀrdet i denna fil Àr "max" .

cgroup.max.descendants (sedan Linux 4.14)

Denna fil definierar en grÀns pÄ antalet levande avkommestyrgrupper som denna styrgrupp fÄr ha. Ett försök att skapa fler avkommor Àn tillÄtet av denna grÀns misslyckas ( mkdir (2) misslyckas med felet EAGAIN ).

Att skriva strÀngen "max" till denna fil betyder att ingen begrÀnsning görs. StandardvÀrdet i denna fil Àr "max" .

STYRGRUPPSDELEGERING: ATT DELEGERA EN HIERARKI TILL EN MINDRE PRIVILEGIERADANVÄNDARE

I styrgruppssammanhang betyder delegering att man överlÄter hanteringen av nÄgot undertrÀd av denna styrgruppshierarki till en oprivilegierad anvÀndare. Cgroups v1 ger stöd för delegering baserat pÄ filrÀttigheter i styrgruppshierarkin men med mindre strikta begrÀnsningsregler Àn v2 (som noteras nedan). Cgroups v2 stödjer delegering med begrÀnsningar genom en explicit design. Fokuset för diskussionen i detta avsnitt Àr pÄ delegering i cgroups v2, med nÄgra avvikelser för cgroups v1 nÀmnda lÀngs vÀgen.

Lite terminologi krÀvs för att beskriva delegering. En delegerare Àr en privilegierad anvÀndare (d.v.s., root) som Àger en förÀldrastyrgrupp. En delegat Àr en oprivilegierad anvÀndare som kommer fÄ rÀttigheterna som behövs för att hantera nÄgon underhierarki under förÀldrastyrgruppen, kÀnt som det delegerade undertrÀdet .

För att utföra en delegering gör delegeraren vissa kataloger och filer skrivbara för delegaten, typiskt genom att Àndra Àgarskap pÄ objekten till att vara anvÀndar-ID:t för delegaten. Om vi antar att vi vill delegera hierarkin med rot vid (förslagsvis) /dlgt_grp och att det inte Ànnu finns nÄgra barnstyrgrupper under den styrgruppen, dÄ Àndras Àgandet av följande till anvÀndar-ID:t för delegaten:
/dlgt_grp

Att Àndra Àgarskap pÄ roten till undertrÀdet betyder att eventuella nya styrgrupper som skapas under det undertrÀdet (och filerna de innehÄller) ocksÄ kommer Àgas av delegaten.

/dlgt_grp/cgroup.procs

Att Àndra Àgandet av den hÀr filen betyder att delegaten kan flytta processer in i roten av det delegerade undertrÀdet.

/dlgt_grp/cgroup.subtree_control (endast cgroups v2)

Att Àndra Àgandet av den hÀr filen betyder att delegaten kan aktivera hanterare (som finns i /dlgt_grp/cgroup.controllers ) för att vidare omfördela resurser till lÀgre nivÄer i undertrÀdet. (Som ett alternativ till att Àndra Àgandet av denna fil kan delegeraren istÀllet lÀgga till valda hanterare till denna fil.)

/dlgt_grp/cgroup.threads (endast cgroups v2)

Att Ă€ndra Ă€gandet av den hĂ€r filen Ă€r nödvĂ€ndigt om ett trĂ„dat undertrĂ€d delegeras (se beskrivningen av ”trĂ„dlĂ€ge”, nedan). Detta tillĂ„ter delegaten att skriva trĂ„d-ID:n till filen. (Ägandet av den hĂ€r filen kan Ă€ven Ă€ndras nĂ€r man delegerar ett domĂ€nundertrĂ€d, men för nĂ€rvarande fyller det inget syfte eftersom, vilket beskrivs nedan, det inte Ă€r möjligt att flytta en trĂ„d mellan domĂ€nstyrgrupper genom att skriva dess trĂ„d-ID till filen cgroups.thread .)

I cgroups v1 Àr istÀllet motsvarande fil som skall delegeras filen tasks .

Delegeraren skall inte Àndra Àgaren av nÄgon annan av hanterarens grÀnssnittsfiler (t.ex., pids.max , memory.high ) i dlgt_grp . Dessa filer anvÀnds frÄn nÀsta nivÄ ovanför det delegerade undertrÀdet för att fördela resurser in i undertrÀdet, och delegaten skall inte ha rÀtt att Àndra resurserna som fördelas in i det delegerade undertrÀdet.

Se Àven diskussionen om filen /sys/kernel/cgroup/delegate i NOTERINGAR för information om ytterligare delegerbara filer i cgroups v2.

Efter att de tidigare nÀmnda stegen har utförts kan delegaten skapa barnstyrgrupper inom det delegerade undertrÀdet (styrgruppens underkataloger och filerna de innehÄller kommer att Àgas av delegaten) och flytta processer mellan styrgrupper i undertrÀdet. Om nÄgra hanterare finns i dlgt_grp/cgroup.subtree_control , eller om Àgandet av den filen överlÀts pÄ delegaten, kan delegaten Àven styra den vidare omfördelningen av motsvarande resurser in i det delegerade undertrÀdet.

Cgroups v2-delegering: nsdelegate och styrgruppsnamnrymder

Med start i Linux 4.13 finns det Àven ett andra sÀtt att utföra styrgruppsdelegering i cgroups v2-hierarkin. Detta görs genom att montera eller montera om cgroups v2-filsystemet med monteringsflaggan nsdelegate . Till exempel, om cgroup v2-filsystemet redan har monterats kan vi montera om det med flaggan nsdelegate sÄ hÀr:

mount -t cgroup2 -o remount,nsdelegate \
none /sys/fs/cgroup/unified

Effekten av denna monteringsflagga Àr att den fÄr styrgruppsnamnrymder att automatiskt bli delegeringsgrÀnser. Mer specifikt gÀller följande restriktioner för processer inuti styrgruppsnamnrymden:

‱

Skrivningar till hanterarens grÀnssnittsfiler i namnrymdens rotkatalog kommer misslyckas med felet EPERM . Processer inuti styrgruppsnamnrymden kan fortfarande skriva till delegerbara filer i styrgruppsnamnrymdens rotkatalog sÄsom cgroup.procs och cgroup.subtree_control , och kan skapa underhierarkier under rotkatalogen.

‱

Försök att migrera processer över namnrymdsgrÀnsen förhindras (med felet ENOENT ). Processer inuti styrgruppsnamnrymden kan fortfarande (med hÀnsyn tagen till inneslutningsreglerna som beskrivs nedan) flytta processer mellan styrgrupper inom underhierarkin under namnrymdsroten.

Möjligheten att definiera styrgruppsnamnrymder som delegeringsgrĂ€nser gör styrgruppsnamnrymder mer anvĂ€ndbara. För att förstĂ„ varför, anta att vi redan har en styrgruppshierarki som har delegerats till en oprivilegierad anvĂ€ndare, cecilia , med den Ă€ldre delegeringstekniken som beskrivs ovan. Anta vidare att cecilia vill delegera en underhierarki vidare under den befintliga delegerade hierarkin. (Till exempel kanske den delegerade hierarkin kan vara associerad med en oprivilegierad behĂ„llare som körs av cecilia .) Även om en styrgruppsnamnrymd anvĂ€ndes skulle, eftersom bĂ„da hierarkierna Ă€gs av den oprivilegierade anvĂ€ndaren cecilia , följande illegitima Ă„tgĂ€rder kunna utföras.

‱

En process i den underliggande hierarkin skulle kunna Àndra resurshanterarens instÀllningar i hierarkins rotkatalog. (Dessa resurshanterares instÀllningar Àr avsedda att möjliggöra utövandet av styrning frÄn förÀldra styrgruppen; en process inuti barngruppen skall inte fÄ Àndra dem.)

‱

En process inuti den underliggande hierarkin skulle kunna flytta processer in i och ut ur den underliggande hierarkin om styrgrupperna i den överliggande hierarkin pÄ nÄgot sÀtt var synliga.

Genom att anvÀnda monteringsflaggan nsdelegate förhindras bÄda dessa möjligheter.

Monteringsflaggan nsdelegate har bara nÄgon effekt nÀr den anvÀnds i den initiala monteringsnamnrymden; i andra monteringsnamnrymder ignoreras flaggan tyst.

Observera : pÄ en del system monterar systemd (1) automatiskt filsystemet cgroup v2. För att experimentera med flaggan nsdelegate kan det vara anvÀndbart att starta kÀrnan med följande kommandoradsflaggor:

cgroup_no_v1=all systemd.legacy_systemd_cgroup_controller

Dessa flaggor fÄr kÀrnan att starta med cgroups v1-hanterarna avaktiverade (vilket betyder att hanterarna finns tillgÀngliga i v2-hierarkin), och sÀger till systemd (1) att inte montera och anvÀnda cgroup v2-hierarkin, sÄ att v2-hierarkin kan monteras manuellt med de önskade flaggorna efter uppstart.

Inneslutningsregler för styrgruppsdelegering

NĂ„gra inneslutningsregler för delegering sĂ€kerstĂ€ller att delegaten kan flytta processer mellan styrgrupper inom det delegerade undertrĂ€det, men inte kan flytta processer utifrĂ„n det delegerade undertrĂ€det in i undertrĂ€det eller vice versa. En oprivilegierad process (d.v.s., delegaten) kan skriva PID:en för en ”mĂ„l”-process in i en fil cgroup.procs endast om alla följande Ă€r sanna:

‱

Skrivaren har skrivrÀttigheter pÄ filen cgroup.procs i mÄlstyrgruppen.

‱

Skrivaren har skrivrÀttigheter till filen cgroup.procs i den nÀrmaste gemensamma anfadern till kÀll- och mÄlstyrgrupperna. Observera att i nÄgra fall kan den nÀrmaste anfadern vara kÀll- eller mÄlstyrgruppen sjÀlv. Detta krav vidmakthÄlls inte för cgroups v1-hierarkier, med konsekvensen att inneslutningen i v1 Àr mindre strikt Àn i v2. (Till exempel kan i cgroups v1 anvÀndaren som Àger tvÄ distinkta delegerade underhierarkier flytta en process mellan hierarkierna.)

‱

Om cgroup v2-filsystemet monterades med flaggan nsdelegate mÄste skrivaren kunna se kÀll- och mÄlstyrgrupperna frÄn sin egen styrgruppsnamnrymd.

‱

I cgroups v1: skrivarens effektiva UID (d.v.s., delegaten) matchar mÄlprocessens verkliga anvÀndar-ID eller sparade set-user-ID. Före Linux 4.11 gÀllde detta krav Àven i cgroups v2. (Detta var ett historiskt krav Àrvt frÄn cgroups v1 som senare bedömdes som onödigt, eftersom de andra reglerna rÀcker för inneslutning i cgroups v2.)

Observera : en konsekvens av dessa inneslutningsreger för delegering Àr att den oprivilegierade delegaten inte kan placera in den första processen i det delegerade undertrÀdet; istÀllet mÄste delegeraren placera in den första processen (en process som Àgs av delegaten) i det delegerade undertrÀdet.

CGROUPS VERSION 2 TRÅDLÄGE

Bland restriktionerna som ÄlÀggs av cgroups v2 och som inte fanns med i cgroups v1 Àr följande:

‱

Ingen styrning pÄ trÄdnivÄ : alla trÄdarna i en process mÄste finnas i samma styrgrupp.

‱

Inga interna processer : en styrgrupp kan inte bÄde ha medlemsprocesser och utöva styrning av barnstyrgrupper.

BÄda dessa restriktioner lades till för att avsaknaden av dessa restriktioner hade orsakat problem i cgroups v1. Speciellt var möjligheten i cgroups v1 att tillÄta upplösning pÄ trÄdnivÄ av styrgruppsmedlemskap inte meningsfull för nÄgra hanterare. (Ett noterbart exempel var hanteraren memory : eftersom trÄdar delar en adressrymd Àr det inte meningsfullt att dela trÄdar mellan olika memory -styrgrupper.)

Oaktat det ursprungliga designbeslutet i cgroups v2 fanns det anvÀndningsfall för vissa hanterare, sÀrskilt hanteraren cpu , för vilka upplösning av styrningen pÄ trÄdnivÄ var meningsfull och anvÀndbar. För att rymma sÄdana fall lade Linux 4.14 till trÄdlÀge till cgroups v2.

TrÄdlÀge tillÄter följande:

‱

Att skapa trÄdade undertrÀd i vilka en process trÄdar kan spridas mellan styrgrupper inuti trÀdet. (Ett trÄdundertrÀd kan innehÄlla flera multitrÄdade processer.)

‱

Begreppet trÄdade hanterare vilka kan fördela resurser mellan styrgrupperna i ett trÄdat undertrÀd.

‱

LĂ€ttandet av ”regeln inga interna processer”, sĂ„ att en styrgrupp kan, inom ett trĂ„dat undertrĂ€d, bĂ„de innehĂ„lla medlemstrĂ„dar och utöva resurshantering mellan barnstyrgrupper.

Med tillĂ€gget av trĂ„dlĂ€ge innehĂ„ller numera varje styrgrupp utom roten en ny fil, cgroup.type , som visar, och under vissa omstĂ€ndigheter kan anvĂ€ndas för att Ă€ndra, en styrgrupps ”typ”. Denna fil innehĂ„ller ett av följande typvĂ€rden:

domain

Detta Àr en normal v2-styrgrupp som tillhandahÄller styrning pÄ processnivÄ. Om en process Àr medlem av denna styrgrupp, dÄ Àr alla processens trÄdar (per definition) i samma styrgrupp. Detta Àr standardtypen för styrgrupper, och ger samma beteende som gavs för styrgrupper i den ursprungliga implementationen av cgroups v2.

threaded

Denna styrgrupp Àr medlem i ett trÄdat undertrÀd. TrÄdar kan lÀggas till till denna styrgrupp, och hanterare kan aktiveras för styrgruppen.

domain threaded

Detta Ă€r en domĂ€nstyrgrupp som tjĂ€nstgör som roten i ett trĂ„dat undertrĂ€d. Denna styrgruppstyp Ă€r Ă€ven kĂ€nd som ”trĂ„dad rot”.

domain invalid

Detta Ă€r en styrgrupp inuti ett trĂ„dat undertrĂ€d som Ă€r i ett ”felaktigt” tillstĂ„nd. Processer kan inte lĂ€ggas till till styrgruppen, och hanterare kan inte aktiveras för styrgruppen. Det enda man kan göra med denna styrgrupp (bortsett frĂ„n att ta bort den) Ă€r att konvertera den till en trĂ„dad styrgrupp genom att skriva strĂ€ngen "threaded" till filen cgroup.type .

Motiveringen till existensen av denna ”provisoriska” typ under skapandet av ett trĂ„dat undertrĂ€d (istĂ€llet för att kĂ€rnan helt enkelt omedelbart konverterar alla styrgrupper under en trĂ„dad rot till typen trĂ„dad ) Ă€r att ge utrymme för möjliga framtida utökningar av modellen för trĂ„dat lĂ€ge.

TrÄdade hanterare kontra domÀnhanterare

I och med tillÀgget av trÄdat lÀge sÀrskiljer cgroups v2 nu tvÄ typer av resurshanterare:

‱

TrÄdade hanterare: dessa hanterare stödjer resursstyrning pÄ trÄdnivÄ och kan aktiveras inuti trÄdade undertrÀd, med resultatet att motsvarande hanterargrÀnssnittsfiler dyker upp inuti styrgrupperna i det trÄdade undertrÀdet. FrÄn och med Linux 4.19 Àr följande hanterare trÄdade: cpu , perf_event och pids .

‱

DomÀn hanterare: dessa hanterare stödjer endast resursstyrning pÄ processnivÄ. FrÄn en domÀnhanterares perspektiv Àr alla trÄdar i en process alltid i samma styrgrupp. DomÀnhanterare kan inte aktiveras inuti ett trÄdat undertrÀd.

Att skapa ett trÄdat undertrÀd

Det finns tvÄ vÀgar som leder till att ett trÄdat undertrÀd skapas. Den första vÀgen Àr som följer:

(1)

Vi skriver strÀngen "threaded" till filen cgroup.type i en styrgrupp y/z som just nu har typen domÀn . Detta har följande effekter:

‱

Typen pÄ styrgruppen y/z blir trÄdad .

‱

FörĂ€ldrastyrgruppens, y , typ blir domĂ€n trĂ„dad . FörĂ€ldrastyrgruppen Ă€r roten i ett trĂ„dat undertrĂ€d (Ă€ven kĂ€nt som ”trĂ„dad rot”).

‱

Alla andra styrgrupper under y som inte redan hade typen trÄdad (för att de befann sig inuti redan befintliga trÄdade undertrÀd under den nya trÄdade roten) konverteras till typen domÀn felaktig .

(2)

Vi skriver strÀngen "threaded" till var och en av styrgrupperna med domÀn felaktig under y , för att konvertera dem till typen trÄdad . Som en konsekvens av detta steg har nu alla trÄdar under den trÄdade roten typen trÄdad och det trÄdade trÀdet Àr dÀrmed fullt anvÀndbart. Kravet att skriva "threaded" till var och en av dessa styrgrupper Àr nÄgot otymplig, men möjliggör tÀnkbara framtida utvidgningar av modellen trÄdlÀge.

Den andra vÀgen att skapa ett trÄdat undertrÀd Àr som följer:

(1)

I en befintlig styrgrupp, z , som just nu har typen domÀn aktiverar vi (1.1) en eller flera av de trÄdade hanterarna och (1.2) gör en process till en medlem av z . (Dessa tvÄ steg kan göras i godtycklig ordning.) Detta har följande konsekvenser:

‱

Typen pÄ z blir domÀn trÄdad .

‱

Alla nedstigande styrgrupper till z som inte redan hade typen trÄdad konverteras till typen domÀn felaktig .

(2)

Som tidigare gör vi det trÄdade undertrÀdet anvÀndbart genom att skriva strÀngen "threaded" till var och en av styrgrupperna med domÀn felaktig under z , för att konvertera dem till typen trÄdad .

En av konsekvenserna av de ovanstÄende sÀtten för att skapa ett trÄdat undertrÀd Àr att den trÄdade rotstyrgruppen endast kan vara förÀlder till styrgrupper som Àr trÄdade (och domÀn felaktiga ). Den trÄdade rotstyrgruppen kan inte vara förÀlder till domÀn styrgrupper, och en trÄdad styrgrupp kan inte ha ett syskon som Àr en domÀn styrgrupp.

Att anvÀnda ett trÄdat undertrÀd

Inom ett trÄdat undertrÀd kan trÄdade hanterare aktiveras i varje undergrupp vars typ har Àndrats till trÄdad ; nÀr man gör det dyker motsvarande grÀnssnittsfiler för hanteraren upp i barnen till den styrgruppen.

En process kan flyttas in i ett trÄdat undertrÀd genom att skriva dess PID till filen cgroup.procs i en av styrgrupperna inuti trÀdet. Detta medför att alla trÄdarna i den processen görs till medlemmar av motsvarande styrgrupp och gör processen till en medlem av det trÄdade undertrÀdet. Processens trÄdar kan sedan spridas över det trÄdade undertrÀdet genom att skriva deras trÄd-ID:n (se gettid (2)) till filerna cgroup.threads i olika styrgrupper inuti undertrÀdet. En process alla trÄdar mÄste befinna sig i samma trÄdade undertrÀd.

Liksom nÀr man skriver till cgroup.procs gÀller vissa inneslutningsregler nÀr man skriver till filen cgroup.threads :

‱

Skrivaren mÄste ha skrivrÀttigheter till filen cgroup.threads i mÄlstyrgruppen.

‱

Skrivaren mÄste ha skrivrÀttigheter till filen cgroup.procs i den gemensamma anfadern till kÀll- och mÄlstyrgrupperna. (I nÄgra fall kan den gemensamma anfadern vara kÀll- eller mÄlstyrgruppen sjÀlv.)

‱

KÀll- och mÄlstyrgrupperna mÄste finnas i samma trÄdade undertrÀd. (Utanför ett trÄdat undertrÀd misslyckas ett försök att flytta en trÄd genom att skriva dess trÄd-ID till filen cgroup.threads i en annan domÀn styrgrupp med felet EOPNOTSUPP .)

Filen cgroup.threads finns i alla styrgrupper (inklusive domÀn styrgrupper) och kan lÀsas för att upptÀcka uppsÀttningen trÄdar som finns i styrgruppen. UppsÀttningen trÄd-ID:n som fÄs nÀr man lÀser denna fil Àr inte garanterat i ordning eller fri frÄn dubbletter.

Filen cgroup.procs i den trÄdade roten visar PID:arna för alla processer som Àr medlemmar av det trÄdade undertrÀdet. Filen cgroup.procs i de andra styrgrupperna i undertrÀdet Àr inte lÀsbara.

DomÀnhanterare kan inte aktiveras i ett trÄdat undertrÀd; inga grÀnssnittsfiler till hanteraren dyker upp i styrgrupperna under den trÄdade roten. FrÄn domÀnhanterarens synvinkel Àr trÄdade undertrÀd osynliga: en multitrÄdad process i ett trÄdat undertrÀd ser för domÀnhanteraren ut som en process som bor i den trÄdade rotstyrgruppen.

Inom ett trĂ„dat undertrĂ€d gĂ€ller inte regeln ”inga interna processer”: en styrgrupp kan bĂ„de innehĂ„lla medlemsprocesser (eller -trĂ„dar) och utöva styrning över barnstyrgrupper.

Regler för att skriva till cgroup.type och att skapa trÄdade undertrÀd

Ett antal regler gÀller vid skrivning till filen cgroup.type :

‱

Endast strÀngen "threaded" fÄr skrivas. Med andra ord, den enda uttryckliga övergÄngen som Àr möjlig Àr att konvertera en domÀn styrgrupp till typen trÄdad .

‱

Resultatet av att skriva "threaded" beror pÄ det nuvarande vÀrdet i cgroup.type enligt följande:

‱

DomÀn eller domÀn trÄdad : inled skapandet av ett trÄdat undertrÀd (vars rot Àr förÀldern till denna styrgrupp) via det första av sÀtten som beskrivs ovan;

‱

DomÀn felaktig : konvertera denna styrgrupp (vilken finns inuti ett trÄdat undertrÀd) till ett anvÀndbart (d.v.s., trÄdat ) tillstÄnd;

‱

TrĂ„dad : ingen effekt (en ”no-op”).

‱

Vi kan inte skriva till en cgroup.type -fil om förÀlderns typ Àr domÀn felaktig . Med andra ord, styrgruppen i ett trÄdat undertrÀd mÄste konverteras till tillstÄndet trÄdad uppifrÄn och ner.

Det finns Àven nÄgra begrÀnsningar som mÄste vara uppfyllda för att skapa ett trÄdat undertrÀd rotat i styrgruppen x :

‱

Det fÄr inte finnas nÄgon medlemsprocess i nedstigande styrgrupper frÄn x . (Styrgruppen x sjÀlv kan ha medlemsprocesser.)

‱

Inga domÀnhanterare fÄr vara aktiverade i x s fil cgroup.subtree_control .

Vid brott mot nÄgon av ovanstÄende begrÀnsningar kommer försök att skriva "threaded" till en fil cgroup.type att misslyckas med felet ENOTSUP .

Styrgruppstypen "domÀn trÄdad"

Enligt metoderna som beskrivs ovan kan typen pÄ en styrgrupp Àndras till domÀn trÄdad i endera av följande fall:

‱

StrÀngen "threaded" skrivs till en barnstyrgrupp.

‱

En trÄdad hanterare aktiveras inuti styrgruppen och en process görs till medlem av styrgruppen.

En domĂ€n trĂ„dad styrgrupp, x , kan Ă„tergĂ„ till typen domĂ€n om ovanstĂ„ende villkor inte lĂ€ngre Ă€r uppfyllda — det vill sĂ€ga, om alla trĂ„dade barnstyrgrupper till x tas bort och antingen x inte lĂ€ngre har trĂ„dade hanterare aktiverade eller inte lĂ€ngre har medlemsprocesser.

NÀr en styrgrupp x som Àr domÀn trÄdad ÄtergÄr till typen domÀn :

‱

Alla avkommor till x som Àr domÀn felaktig och som inte Àr i underliggande trÄdade undertrÀd ÄtergÄr till typen domÀn .

‱

Rotstyrgruppen i eventuella underliggande trÄdade undertrÀd ÄtergÄr till typen domÀn trÄdad .

Undantag för rotstyrgruppen

Rotstyrgruppen i v2-hierarkin hanteras speciellt: den kan vara förÀlder till bÄde domÀn och trÄdade styrgrupper. Om strÀngen "threaded" skrivs till filen cgroup.type i ett av barnen till rotstyrgruppen, dÄ

‱

blir typen pÄ den styrgruppen trÄdad .

‱

Àndras typen pÄ avkommor till den styrgruppen som inte Àr en del av underliggande trÄdade undertrÀd till domÀn felaktig .

Observera att i detta fall finns det ingen styrgrupp vars typ blir domÀn trÄdad . (Teoretiskt sett kan rotstyrgruppen betraktas som den trÄdade roten till styrgruppen vars typ Àndrades till trÄdad .)

Syftet med denna speciella hantering av rotstyrgruppen Àr att lÄta en trÄdad styrgrupp som anvÀnder hanteraren cpu att placeras sÄ högt som möjligt i hierarkin, för att minimera den (lilla) kostnaden i att traversera styrgruppshierarkin.

Hanteraren "cpu" i cgroups v2 och realtidstrÄdar

Per Linux 4.19 stödjer inte hanteraren cpu i cgroups v2 styrning av realtidstrÄdar (specifikt trÄdar schemalagda under nÄgon av policyerna SCHED_FIFO , SCHED_RR och SCHED_DEADLINE ; se sched (7)). DÀrför kan hanteraren cpu aktiveras i rotstyrgruppen endast om alla realtidstrÄdar finns i rotstyrgruppen. (Om det finns realtidstrÄdar i andra styrgrupper Àn roten, dÄ misslyckas ett anrop av write (2) med strÀngen "+cpu" till filen cgroup.subtree_control med felet EINVAL .)

PÄ vissa system placerar systemd (1) vissa realtidstrÄdar i andra styrgrupper Àn roten i v2-hierarkin. PÄ sÄdana system mÄste dessa trÄdar först flyttas till rotstyrgruppen innan cpu -hanteraren kan aktiveras.

FEL

Följande fel kan förekomma för mount (2):

EBUSY

Ett försök att montera ett styrgruppsfilsystem för version 1 som inte specificerade vare sig flaggan name= (för att montera en namngiven hierarki) eller ett hanterarnamn (eller all ).

NOTERINGAR

En barnprocess som skapas via fork (2) Àrver sin förÀlders styrgruppsmedlemskap. En process styrgruppsmedlemskap bevaras över execve (2).

Flaggan CLONE_INTO_CGROUP till clone3 (2) kan anvÀndas för att skapa en barnprocess som inleder sitt liv i en annan version-2-styrgrupp Àn förÀldraprocessen.

/proc-filer

/proc/cgroups (sedan Linux 2.6.24)

Denna fil innehÄller information om hanterarna som Àr inkompilerade i kÀrnan. Ett exempel pÄ innehÄllet i denna fil (omformaterat för lÀsbarhet) Àr följande:

#subsys_name hierarchy num_cgroups enabled
cpuset 4 1 1
cpu 8 1 1
cpuacct 8 1 1
blkio 6 1 1
memory 3 1 1
devices 10 84 1
freezer 7 1 1
net_cls 9 1 1
perf_event 5 1 1
net_prio 9 1 1
hugetlb 0 1 0
pids 2 1 1

FÀlten i denna fil Àr, frÄn vÀnster till höger:

[1]

Namnet pÄ hanteraren.

[2]

Det unika ID:t för styrgruppshierarkin pÄ vilken denna hanterare Àr monterad. Om flera cgroups v1-hanterare Àr bundna till samma hierarki kommer var och en visa samma hierarki-ID i detta fÀlt. VÀrdet i detta fÀlt kommer vara 0 om:

‱

hanteraren inte Àr monterad pÄ en cgroups v1-hierarki;

‱

hanteraren Àr bunden till cgroups v2s enda unifierade hierarki eller

‱

hanteraren Àr avaktiverad (se nedan).

[3]

Antalet styrgrupper i denna hierarki som anvÀnder denna hanterare.

[4]

Detta fÀlt har vÀrdet 1 om denna hanterare Àr aktiverad eller 0 om den har avaktiverats (via parametern cgroup_disable pÄ kÀrnans kommandorad vid uppstart).

/proc/ pid /cgroup (sedan Linux 2.6.24)

Denna fil beskriver styrgrupperna till vilken processen med motsvarande PID hör. Den visade informationen skiljer mellan hierarkierna för styrgrupper version 1 och version 2.

För varje styrgruppshierarki i vilken processen Àr medlem finns det en post som innehÄller tre kolonseparerade fÀlt:

hierarki-ID:hanterarlista:styrgruppssökvÀg

Till exempel:

5:cpuacct,cpu,cpuset:/daemons

De kolonseparerade fÀlten Àr, frÄn vÀnster till höger:

[1]

För version 1-hierarkier av styrgrupper innehÄller detta fÀlt ett unikt hierarki-ID-nummer som kan matchas med ett hierarki-ID i /proc/cgroups . För version 2-hierarkin av styrgrupper innehÄller detta fÀlt vÀrdet 0.

[2]

För version 1-hierarkier av styrgrupper innehÄller detta fÀlt en kommaseparerad lista över hanterare bundna till hierarkin. För version 2-hierarkin av styrgrupper Àr detta fÀlt tomt.

[3]

Detta fÀlt innehÄller sökvÀgen till styrgruppen i hierarkin den hör till. SökvÀgen Àr relativ hierarkins monteringspunkt.

/sys/kernel/cgroup-filer

/sys/kernel/cgroup/delegate (sedan Linux 4.15)

Denna fil exporterar en lista över filerna i cgroups v2 (en per rad) som gÄr att delegera (d.v.s., vars Àgarskap skall Àndras till delegatens anvÀndar-ID). I framtiden kan uppsÀttningen delegerbara filer Àndras eller vÀxa, och denna fil ger en möjlighet för kÀrnan att informera program i anvÀndarrymden om vilka filer som mÄste delegeras. Per Linux 4.15 syns följande nÀr man inspekterar filen:

$ cat /sys/kernel/cgroup/delegate
cgroup.procs
cgroup.subtree_control
cgroup.threads

/sys/kernel/cgroup/features (sedan Linux 4.15)

Med tiden kan samlingen av funktioner i cgroups v2 som kÀrnan tillhandahÄller Àndras eller vÀxa, och nÄgra funktionerna kanske inte aktiveras som standard. Denna fil ger ett sÀtt för program i anvÀndarrymden att avgöra vilka funktioner den körande kÀrnan stödjer och har aktiverade. Funktioner listas en per rad:

$ cat /sys/kernel/cgroup/features
nsdelegate
memory_localevents

Posterna som kan förekomma i denna fil Àr:
memory_localevents
(sedan Linux 5.2)

KÀrnan stödjer monteringsflaggan memory_localevents .

nsdelegate (sedan Linux 4.15)

KÀrnan stödjer monteringsflaggan nsdelegate .

memory_recursiveprot (sedan Linux 5.7)

KÀrnan stödjer monteringsflaggan memory_recursiveprot .

SE ÄVEN

prlimit (1), systemd (1), systemd-cgls (1), systemd-cgtop (1), clone (2), ioprio_set (2), perf_event_open (2), setrlimit (2), cgroup_namespaces (7), cpuset (7), namespaces (7), sched (7), user_namespaces (7)

KÀrnans kÀllfil Documentation/admin-guide/cgroup-v2.rst .

ÖVERSÄTTNING

Den svenska översÀttningen av denna manualsida skapades av Göran Uddeborg <goeran@uddeborg.se>

Denna översÀttning Àr fri dokumentation; lÀs GNU General Public License Version 3 eller senare för upphovsrÀttsvillkor. Vi tar INGET ANSVAR.

Om du hittar fel i översÀttningen av denna manualsida, skicka ett mail till Tp-sv@listor.tp-sv.se .