cgroups(7)

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 minneshanteraren 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
The following options (mount -o) can be specified when mounting the group v2 filesystem:

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 barnstyrgruppen. 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 /sg1s 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 PRIVILEGIERAD ANVÄ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äldrastyrgruppen; 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änhanterare: 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änstyrgrupper, och en trådad styrgrupp kan inte ha ett syskon som är en domänstyrgrupp.

  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änstyrgrupp med felet EOPNOTSUPP.)

Filen cgroup.threads finns i alla styrgrupper (inklusive domänstyrgrupper) 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änstyrgrupp 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 xs 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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.