cgroups - cgroups

cgroups
Autori originali v1: Paul Menage, Rohit Seth
v2: Tejun Heo
Dezvoltatori Tejun Heo, Johannes Weiner, Michal Hocko, Waiman Long, Roman Gushchin, Chris Down și colab.
Eliberarea inițială 2007 ; Acum 14 ani ( 2007 )
Scris in C
Sistem de operare Linux
Tip Programul sistemului
Licență GPL și LGPL
Site-ul web www .kernel .org / doc / Documentation / cgroup-v1 / pentru v1 și www .kernel .org / doc / Documentation / cgroup-v2 .txt pentru v2

cgroups (prescurtat din grupuri de control ) este o caracteristică de kernel Linux care limitează, contabilizează și izolează utilizarea resurselor (CPU, memorie, I / O de disc, rețea etc.) a unei colecții de procese .

Inginerii de la Google (în principal Paul Menage și Rohit Seth ) au început lucrul la această caracteristică în 2006 sub numele de "containere de proces". La sfârșitul anului 2007, nomenclatura s-a schimbat în „grupuri de control” pentru a evita confuzia cauzată de mai multe semnificații ale termenului „ container ” în contextul nucleului Linux, iar funcționalitatea grupurilor de control a fost fuzionată în linia principală a nucleului Linux în versiunea 2.6.24 a nucleului, care a fost lansat în ianuarie 2008. De atunci, dezvoltatorii au adăugat multe funcții și controlere noi, cum ar fi suport pentru kernfs în 2014, firewall și ierarhie unificată. cgroup v2 a fost îmbinat în kernel-ul Linux 4.5 cu modificări semnificative ale interfeței și funcționalității interne.

Versiuni

Există două versiuni ale cgroup-urilor.

Cgroups a fost scris inițial de Paul Menage și Rohit Seth și integrat în kernel-ul Linux în 2007. Ulterior, aceasta este numită cgroups versiunea 1.

Dezvoltarea și întreținerea grupurilor a fost apoi preluată de Tejun Heo . Tejun Heo a reproiectat și a rescris grupuri. Această rescriere se numește acum versiunea 2, documentația cgroups-v2 a apărut pentru prima dată în kernel-ul Linux 4.5 lansat pe 14 martie 2016.

Spre deosebire de v1, cgroup v2 are o singură ierarhie de proces și discrimină între procese, nu fire.

Caracteristici

Unul dintre obiectivele de proiectare ale cgroup-urilor este de a oferi o interfață unificată pentru multe cazuri diferite de utilizare , de la controlul proceselor individuale (de exemplu, folosind frumos ) până la virtualizarea completă la nivel de sistem de operare (așa cum este furnizat de OpenVZ , Linux-VServer sau LXC , de exemplu). Cgroups oferă:

Limitarea resurselor
grupurile pot fi setate să nu depășească o limită de memorie configurată , care include și memoria cache a sistemului de fișiere
Prioritizare
unele grupuri pot obține o pondere mai mare din utilizarea procesorului sau a randamentului I / O pe disc
Contabilitate
măsoară utilizarea resurselor unui grup, care poate fi utilizată, de exemplu, în scopuri de facturare
Control
blocarea grupurilor de procese, verificarea și repornirea acestora

Utilizare

Image
Ca exemplu de utilizare indirectă, systemd își asumă accesul exclusiv la facilitatea cgroups

Un grup de control (abreviat ca cgroup) este o colecție de procese care sunt legate de aceleași criterii și asociate cu un set de parametri sau limite. Aceste grupuri pot fi ierarhizate, ceea ce înseamnă că fiecare grup moștenește limite de la grupul său părinte. Nucleul oferă acces la mai multe controlere (numite și subsisteme) prin interfața cgroup; de exemplu, controlerul „memorie” limitează utilizarea memoriei, utilizarea procesorului conturilor „cpuacct” etc.

Grupurile de control pot fi utilizate în mai multe moduri:

  • Accesând manual sistemul de fișiere virtual cgroup.
  • Prin crearea și gestionarea grupurilor de pe zbura folosind instrumente cum ar fi cgcreate, cgexecși cgclassify(la libcgroup).
  • Prin intermediul „demonului motor de reguli” care poate muta automat procesele anumitor utilizatori, grupuri sau comenzi în grupuri c, după cum se specifică în configurația sa.
  • Indirect, prin intermediul altor programe software care utilizează cgroup-uri, cum ar fi Docker , Firejail , LXC , libvirt , systemd , Open Grid Scheduler / Grid Engine și lmctfy din punct de vedere al dezvoltării Google .

Documentația kernel-ului Linux conține câteva detalii tehnice despre configurarea și utilizarea grupurilor de control versiunea 1 și versiunea 2. systemd-cgtopComanda poate fi utilizată pentru a afișa grupurile de control de top prin utilizarea resurselor lor.

Reproiectați

Redesignul cgroupurilor a început în 2013, cu modificări suplimentare aduse de versiunile 3.15 și 3.16 ale kernel-ului Linux.

Izolarea spațiului de nume

Deși nu face parte din punct de vedere tehnic al grupurilor cgroup, o caracteristică conexă a kernel-ului Linux este izolarea spațiului de nume , unde grupurile de procese sunt separate astfel încât să nu poată „vedea” resursele din alte grupuri. De exemplu, un spațiu de nume PID oferă o enumerare separată a identificatorilor de proces din cadrul fiecărui spațiu de nume. De asemenea, sunt disponibile spații de nume de montare, utilizator, UTS, rețea și SysV IPC.

  • Spațiul de nume PID oferă izolare pentru alocarea identificatorilor de proces (PID), a listelor de procese și a detaliilor acestora. În timp ce noul spațiu de nume este izolat de alți frați, procesele din spațiul său de nume „părinte” încă văd toate procesele în spațiile de nume copil - deși cu numere PID diferite.
  • Spațiul de nume al rețelei izolează controlerele de interfață de rețea (fizice sau virtuale), regulile firewall-ului iptables , tabelele de rutare etc. Spațiile de nume ale rețelei pot fi conectate între ele utilizând dispozitivul Ethernet virtual „veth”.
  • Spațiul de nume „UTS” permite schimbarea numelui de gazdă .
  • Mount namespace permite crearea unui aspect diferit al sistemului de fișiere sau realizarea anumitor puncte de montare numai în citire.
  • Spațiul de nume IPC izolează comunicarea inter-proces System V între spațiile de nume.
  • Spațiul de nume al utilizatorului izolează ID-urile de utilizator între spațiile de nume.
  • Cgroup spațiu de nume

Spațiile de nume sunt create cu comanda „ unshare ” sau syscall sau ca steaguri noi într-un syscall „clonează”.

Subsistemul „ns” a fost adăugat la începutul dezvoltării cgroup-urilor pentru a integra spații de nume și grupuri de control. Dacă grupul c "ns" ar fi montat, fiecare spațiu de nume ar crea, de asemenea, un grup nou în ierarhia cgroup. Acesta a fost un experiment care ulterior a fost considerat a fi o potrivire slabă pentru API-ul cgroups și eliminat din nucleu.

Spațiile de nume Linux au fost inspirate de funcționalitatea mai generală a spațiului de nume folosită intens în Plan 9 de la Bell Labs .

Ierarhie unificată

Kernfs a fost introdus în nucleul Linux cu versiunea 3.14 în martie 2014, autorul principal fiind Tejun Heo. Unul dintre motivatorii principali pentru un kernfs separat este sistemul de fișiere cgroups. Kernfs este creat practic prin împărțirea unei părți din logica sysfs într-o entitate independentă, facilitând astfel pentru alte subsisteme kernel implementarea propriului sistem de fișiere virtuale cu gestionare pentru conectarea și deconectarea dispozitivului, crearea și eliminarea dinamică și alte atribute. Redesign-ul a continuat în versiunea 3.15 a kernel-ului Linux.

Grupuri de control memorie kernel (kmemcg)

Grupurile de control al memoriei kernel ( kmemcg ) au fost îmbinate în versiunea 3.8 (18 februarie 2013 ; acum 8 ani ) a liniei principale a kernel-ului Linux . Controlerul kmemcg poate limita cantitatea de memorie pe care nucleul o poate utiliza pentru a-și gestiona propriile procese interne.  ( 18-02-2013 )

conștientizarea grupului de criminalul OOM

Linux Kernel 4.19 (octombrie 2018) a introdus conștientizarea cgroup-ului de implementare OOM killer, care adaugă o capacitate de a ucide un cgroup ca o singură unitate și astfel garantează integritatea volumului de lucru.

Adopţie

Diferite proiecte folosesc cgroups ca bază a acestora, inclusiv CoreOS , Docker (în 2013), Hadoop , Jelastic , Kubernetes , lmctfy (Let Me Conțin asta pentru tine), LXC (LINUX Containere), systemd , Mesos și mezosferei, și HTCondor . Distribuțiile majore Linux l-au adoptat, de asemenea, cum ar fi Red Hat Enterprise Linux (RHEL) 6.0 în noiembrie 2010, cu trei ani înainte de adoptarea de către nucleul principal Linux.

La 29 octombrie 2019, Proiectul Fedora a modificat Fedora 31 pentru a utiliza CgroupsV2 în mod implicit

Vezi si

Referințe

linkuri externe