Limitarea utilizării CPU și a memoriei unei comenzi cu grupurile de control Ubuntu

Dacă o comandă face ca desktopul Ubuntu să funcționeze lent sau cauzează ca un server să funcționeze cu memorie insuficientă, puneți comanda și procesele sale secundare într-un cgroup gestionat de systemd, cu o cotă CPU și un plafon de memorie. În versiunile actuale de Ubuntu, systemd-run --scopeeste cea mai scurtă rută practică: pornește comanda într-un domeniu temporar, iar systemd aplică limitele prin controalele cgroup.

Exemplul de mai jos limitează o sarcină de lucru la jumătate din capacitatea unui procesor și 1 GiB de memorie. Acestea sunt limite pentru întregul domeniu de aplicare, inclusiv procesele fiu; nu reprezintă o promisiune că programul va rula la o anumită viteză.

De ce un proces are nevoie de o limită de grup de control (cgroup)

Un proces încărcat poate concura cu aplicațiile interactive, în timp ce un proces care consumă multă memorie poate împinge mașina într-o stare de revendicare sau de memorie insuficientă. Un cgroup grupează un proces cu descendenții săi, astfel încât kernelul să poată lua în considerare și constrânge acel grup. Systemd din Ubuntu oferă o interfață convenabilă pentru aceste controale.

Setările CPU și ale memoriei se comportă diferit. CPUQuota=50%limitează timpul CPU la jumătate din capacitatea unui CPU, calculat în medie pe o perioadă de planificare. O valoare a 200%reprezintă timpul de până la două CPU atunci când este disponibil. Acesta este un plafon, nu o prioritate CPU sau o rezervare. MemoryMax=1Gstabilește un plafon fix pentru memoria încărcată în cgroup; dacă volumul de lucru nu poate rămâne sub acesta, kernelul poate recupera memoria sau poate invoca o închidere pentru memorie insuficientă pentru un proces din acel cgroup. Alegeți o limită cu spațiu liber pentru aplicație și copiii săi.

1. Verificați dacă Ubuntu folosește cgroup v2

Sistemele Ubuntu care utilizează systemd utilizează în mod obișnuit ierarhia unified cgroup v2. Confirmați configurarea activă înainte de a vă baza pe căile afișate mai târziu:

stat -fc %T /sys/fs/cgroup
systemctl --version | head -n 1

Prima comandă ar trebui să raporteze cgroup2fs. Dacă raportează un alt tip de sistem de fișiere, căile de fișiere cgroup v2 din acest articol nu se aplică așa cum sunt scrise. Proprietățile systemd pot fi în continuare acceptate cu o ierarhie diferită, dar utilizați documentația distribuției corespunzătoare în loc să copiați căile v2.

Verificați și versiunea exactă a systemd dacă o proprietate este respinsă. Documentația Noble a Ubuntu descrie ` CPUQuota=` și ` MemoryMax=` ca setări de control al resurselor; versiunile mai vechi de Ubuntu pot include versiuni diferite de systemd.

2. Porniți sarcina de lucru într-un domeniu limitat

Rulați programul prin systemd-run, înlocuind executabilul său real cu și argumentele . Pentru o comandă din directorul curent, utilizați ./și transmiteți toate argumentele după --:

systemd-run --scope \
  -p CPUQuota=50% \
  -p MemoryMax=1G \
  -- ./my-program --input data.csv
Terminal Ubuntu care rulează systemd-run cu CPUQuota setat la 50% și MemoryMax setat la 1G pentru o comandă
Lansează o comandă într-un domeniu systemd tranzitoriu cu limite de CPU și memorie.

Pentru o comandă deținută de utilizator, încercați acest lucru fără a sudoexecuta comanda mai întâi. Dacă systemd raportează că un controler sau o proprietate solicitată nu este disponibilă, este posibil ca managerul de utilizatori să nu aibă permisiunea de a o delega; reîncercarea ca root poate fi potrivită pentru o sarcină de lucru la nivel de sistem, dar modifică contextul de securitate al comenzii. Nu rulați întâmplător un program neîncrezător ca root. Dacă este necesară utilizarea managerului de sistem ca root, utilizați comanda sudo systemd-run --scope ...numai după luarea în considerare a acestei modificări.

Terminalul rămâne atașat la osciloscop în timp ce comanda rulează. Apăsarea butonului Ctrl+Cîntrerupe operațiunea în prim-plan. Osciloscopul este tranzitoriu și, în mod normal, dispare după încheierea proceselor. Este o modalitate convenabilă de a porni o comandă sub limite, mai degrabă decât o politică persistentă pentru lansări viitoare.

3. Găsiți domeniul de aplicare și inspectați limitele acestuia

systemd-runafișează numele unității pe care o creează, de obicei ceva de genul run-….scope. În timp ce comanda rulează încă, listați arborele cgroup:

systemd-cgls

Găsiți domeniul de aplicare tranzitoriu și confirmați că programul țintă și copiii săi apar sub acesta. Acest lucru este important deoarece un copil care rulează în afara domeniului de aplicare nu va fi acoperit de același plafon al grupului de comandă (cgroup).

Arbore Cgroup terminal care prezintă un domeniu de execuție tranzitoriu care conține un program și două procese worker
Folosește arborele cgroup pentru a confirma că programul și lucrătorii săi sunt grupați sub domeniul de aplicare tranzitoriu.

Folosește numele domeniului de aplicare tipărit în următoarea comandă. Înlocuiește-l run-abc.scopecu numele real:

systemctl show run-abc.scope \
  -p ControlGroup -p CPUQuotaPerSecUSec -p MemoryMax

CPUQuotaPerSecUSec=50000este consistent cu o cotă de 50% atunci când perioada de cotă a systemd este de 100 ms; MemoryMax=1073741824este de 1 GiB în octeți. Valorile live sunt mai utile decât presupunerea că fiecare gazdă va accepta fiecare cerere neschimbată, deoarece grupurile de control părinte și controlerele disponibile pot constrânge rezultatul efectiv.

systemctl afișează ieșirea cu valorile ControlGroup, cota CPU și valorile maxime ale memoriei pentru un domeniu tranzitoriu
Verificați grupul de control raportat de osciloscop și limitele configurate ale CPU și memoriei.

4. Verificați fișierele cgroup ale kernelului și ajustați în siguranță

Proprietatea ControlGroupoferă calea cgroup relativă la /sys/fs/cgroup. Stochează-o într-o variabilă shell, astfel încât comenzile să urmeze calea atribuită efectiv pe mașina ta:

UNIT=run-abc.scope
CG=$(systemctl show "$UNIT" -p ControlGroup --value)
printf 'Group: %s\n' "$CG"
cat "/sys/fs/cgroup$CG/cpu.max"
cat "/sys/fs/cgroup$CG/memory.max"

Pe cgroup v2, cpu.maxconține o cotă și o perioadă în microsecunde. De exemplu, 50000 100000înseamnă 50 ms de timp CPU în fiecare perioadă de 100 ms. memory.maxarată plafonul de memorie în octeți. Dacă fișierele lipsesc, confirmați că domeniul de aplicare este încă activ și că kernelul utilizează cgroup v2.

Terminalul citește cpu.max și memory.max din domeniul de aplicare systemd sub sysfs cgroup v2
Citiți fișierele cgroup v2 ale kernelului pentru a verifica cota configurată și plafonul de memorie.

Dacă ați pornit o unitate denumită cu execuție lungă și trebuie să îi ajustați limitele, systemd acceptă modificarea proprietăților resurselor pe o unitate activă, de exemplu sudo systemctl set-property --runtime my-worker.service CPUQuota=50% MemoryMax=1G. Aceasta se aplică grupului de control al serviciului respectiv și necesită privilegii corespunzătoare. Nu atașează un proces arbitrar care rulează deja doar pentru că PID-ul său este cunoscut; pentru un proces singular, opriți-l complet și relansați-l prin domeniul de aplicare limitat. Pentru un serviciu persistent, configurați proprietățile în unitatea de serviciu sau într-un drop-in systemd și reporniți-l în timpul unei ferestre de mentenanță corespunzătoare.

Verificați rezultatul

Mențineți volumul de lucru activ în timp ce îl inspectați. Confirmați că systemd-cglsplasează procesul și copiii săi în domeniul de aplicare dorit, că systemctl showraportează proprietățile solicitate și că fișierele corespunzătoare cpu.maxși memory.maxexistă cu valori finite. Când procesul se termină, domeniul de aplicare tranzitoriu este eliminat, astfel încât fișierele sale cgroup pot dispărea.

O cotă limitează timpul CPU, dar nu garantează un procent fix într-un monitor desktop, iar o limită fixă ​​de memorie poate cauza erori dacă aplicația are nevoie de mai mult decât limita. Dacă sarcina de lucru devine instabilă, opriți-o și creșteți limita la o valoare sigură măsurată sau utilizați un MemoryHigh=prag de presiune mai mic, alături de unul mai mare MemoryMax=. Pentru un comportament exact, verificați documentația systemd și a kernelului instalate; referințele autorizate sunt manualul Ubuntu systemd-run , manualul Ubuntu systemd resource-control și documentația kernelului Linux cgroup v2 .

Lasă un comentariu

Cum se convertesc tensiunea, curentul, kW, kVA și factorul de putere trifazate

Cum se convertesc tensiunea, curentul, kW, kVA și factorul de putere trifazate

Învățați formulele pentru trifazate echilibrate și convertiți pas cu pas tensiunea de linie, curentul, kW, kVA și factorul de putere, cu un exemplu practic și limite de verificat.

Limitarea utilizării CPU și a memoriei unei comenzi cu grupurile de control Ubuntu

Limitarea utilizării CPU și a memoriei unei comenzi cu grupurile de control Ubuntu

Rulați o sarcină de lucru în cadrul unui domeniu systemd cu CPUQuota și MemoryMax, apoi verificați limitele prin cgroup v2.

Criptați DNS-ul în amonte Pi-hole pe serverul Ubuntu 24.04

Criptați DNS-ul în amonte Pi-hole pe serverul Ubuntu 24.04

Configurați dnscrypt-proxy ca bridge DoH local al Pi-hole pe Ubuntu 24.04, cu un listener doar pentru localhost, selecția unui resolver și verificări înainte de a comuta DNS.

Cum să faci gesturi touchpad Ubuntu 24.04 să funcționeze pe Wayland

Cum să faci gesturi touchpad Ubuntu 24.04 să funcționeze pe Wayland

Verificați setările touchpad-ului din Ubuntu, confirmați Wayland și testați glisările încorporate în GNOME înainte de a depana aplicațiile sau hardware-ul.

Construiți un mirror Debian 12 RAID 1 cu mdadm

Construiți un mirror Debian 12 RAID 1 cu mdadm

Creați și verificați o matrice de date Debian 12 RAID 1 cu două discuri, formatați-o în siguranță și configurați-o pentru asamblare și montare după repornire.

Criptați Debian 12 Swap cu o cheie nouă la fiecare pornire

Criptați Debian 12 Swap cu o cheie nouă la fiecare pornire

Configurați criptarea cu cheie aleatorie pentru o partiție swap Debian 12 existentă, verificați maparea activă dm-crypt și înțelegeți compromisul de hibernare.

Cum să restricționezi utilizatorii SSH la anumite directoare pe Ubuntu 24.04 (Ghid SFTP Chroot)

Cum să restricționezi utilizatorii SSH la anumite directoare pe Ubuntu 24.04 (Ghid SFTP Chroot)

Restricționați conturile SSH Ubuntu 24.04 la foldere SFTP desemnate cu chroot, permisiuni corespunzătoare, reguli de potrivire și teste sigure - fără a acorda acces la shell.

Eliberați în siguranță blocarea APT a Ubuntu și finalizați actualizarea

Eliberați în siguranță blocarea APT a Ubuntu și finalizați actualizarea

Găsiți ce proces deține blocarea interfeței dpkg din Ubuntu, permiteți finalizarea lucrărilor la pachet și reparați instalările întrerupte fără a șterge fișierele de blocare.

Cum se configurează instantanee Btrfs automate pe desktopul Ubuntu

Cum se configurează instantanee Btrfs automate pe desktopul Ubuntu

Configurați instantanee de sistem Btrfs programate pe Ubuntu Desktop cu Timeshift, verificați aspectul subvolumului Ubuntu, alegeți retenția și înțelegeți ce instantanee nu pot proteja.

Cum să migrezi Debian 12 la Testing fără a încălca dependențele

Cum să migrezi Debian 12 la Testing fără a încălca dependențele

Planificați o migrare mai sigură de la Debian 12 la Testing: actualizați prin Stable, faceți copii de rezervă, curățați sursele APT, simulați modificările dependențelor și verificați ce s-a schimbat.