- Cpusets so podsistem cgroups, ki omejuje, na katerih CPU-jih in pomnilniških vozliščih se lahko procesi izvajajo in na katerih rezervirajo pomnilnik.
- Konfiguracija se izvede prek datotečnega sistema cgroup, pri čemer se ustvarijo hierarhije imenikov in prilagodijo datoteke, kot sta cpuset.cpus in cpuset.mems.
- Dodatni krmilniki, kot so CPU, pomnilnik ali BLKIO, omogočajo omejevanje in obračunavanje CPU, RAM in V/I, s čimer integrirajo nabore CPU v globalno strategijo upravljanja virov.
- V cgroup v2 so krmilniki, kot sta cpu in cpuset, združeni v eno samo drevo, kar omogoča natančne kvote CPU-ja prek datotek, kot je cpu.max.
Če delate s strežniki Linux Obkroženi s storitvami ste se verjetno že spraševali, kako dobro porazdelite Procesor in pomnilnik med procesi, ne da bi eden prevladal nad drugim. Prioritete z nice In klasične omejitve pomagajo, toda ko vsi želijo vse vire, sistem postane džungla.
Tukaj prideta do izraza dva ključna dela jedra: cgroups in podsistem cpusetZahvaljujoč njim lahko natančno določite, kateri procesi uporabljajo katere procesorje in katera pomnilniška vozlišča, spremljate njihovo porabo, omejite pasovno širino procesorja ali diska in jih celo združite, da ustvarite "mehke particije" znotraj istega strežnika.
Kaj so c-skupine in zakaj so pomembne?
P kontrolne skupine (cgroups) So mehanizem jedra Linuxa za združite procese in zanje uporabite skupne pravilnike virovCPU, pomnilnik, V/I disk, naprave, omrežje itd. To ne nadomešča tradicionalnih dovoljenj, temveč jih dopolnjuje z vidika koliko Vsaka skupina porablja, ne samo ena. na kaj ima dostop.
V primerjavi s tradicionalnimi orodji, kot so nice, ionice o limits.confcgroups vam omogočajo, da definirate skupinske hierarhije pri katerem vsak niz procesov prejme vnaprej določen delež virov, ne glede na to, koliko procesov je v vsaki skupini.
V sodobnih jedrih so c-skupine izpostavljene prek virtualni datotečni sistem (cgroup v1 ali cgroup v2) običajno nameščen na /sys/fs/cgroupVsak poddirektorij predstavlja skupino, datoteke v njem pa omogočajo ogled in spreminjanje njegove konfiguracije.
cpusets: podsistem za vezavo procesov na CPU-je in pomnilniška vozlišča
Znotraj c-skupin, CPU komplet je krmilnik (podsistem) odgovoren za omejiti, katere procesorje in katere pomnilniške vozlišča Lahko izvaja in dodeli pomnilnik za niz nalog. To je še posebej uporabno v veliki stroji z veliko jedri in topologijo NUMA, smiselno pa je tudi na skromnejših strežnikih, ko želite izolirati delovne obremenitve.
Vsak sklop procesorjev določa dva temeljna sklopa:
cpuset.cpus: seznam procesorjev, na katerih se lahko izvajajo naloge skupine.cpuset.mems: seznam pomnilniških vozlišč, v katerih lahko te naloge rezervirajo pomnilnik.
Ko proces pokliče sched_setaffinity(), mbind() o set_mempolicy()jedro filtrirajte te zahteve tako da lahko uporabljajo samo procesorje in vozlišča, ki so vključena v njihov trenutni nabor procesorjev. Poleg tega razporejevalnik te naloge nikoli ne bo razporedil na procesorju, ki ni v njegovi dovoljeni maski, in dodeljevalec strani ne bo rezerviral pomnilnika na vozliščih zunaj njega. mems.
Zakaj so procesorji tako uporabni v velikih sistemih
Na strežnikih z veliko procesorji in pomnilnikom, porazdeljenim po več vozliščih, proces in namestitev pomnilnika To ima velik vpliv na zmogljivost. Dostop do "oddaljenega" pomnilnika na računalniku NUMA je lahko veliko počasnejši kot dostop do lokalnega pomnilnika vozlišča, kjer deluje procesor.
S procesorskimi sklopi lahko ustvarite podmnožice strojev (mehke particije) in tem podmnožicam dodeliti celotne naloge: na primer eno skupino jeder in pomnilniških vozlišč za bazo podatkov, drugo za spletni vmesnik in tretjo za računsko intenzivne delovne obremenitve. Te skupine so lahko dinamično prilagajanje odvisno od obremenitve sistema, ne da bi pri tem motilo opravila, ki se že izvajajo na drugih particijah.
To je zelo pogosta strategija v:
- Spletni strežniki ki izvajajo več primerkov iste storitve.
- Mešani stroji z deljenjem spleta, baze podatkov in drugih demonov strojna oprema.
- Grozdi NUMA in HPC ki izvajajo znanstvene aplikacije, občutljive na pomnilniško zakasnitev.
Praktičen primer: ukrotitev pohlepnega Apacheja s cgroups in cpuset
Predstavljajte si strežnik z dve jedri in strežnik Apache, ki dinamično zažene podprocese. Čeprav imajo vsi enake niceV praksi bo procesor, ki je na voljo preostalim storitvam, odvisen od števila aktivnih procesov Apache v danem trenutku.
Z običajnimi prioritetami Dogajajo se takšne stvari:
- Apache z 9 procesi in druga storitev z 1: druga prejme 10 % procesorja.
- Apache z 99 procesi, drugi pa z 1: drugi pade na 1 % procesorja.
Prioriteta se ne spremeni, ampak število procesov daIn to uničuje pravičnost. Z ukazoma cgroups in cpuset lahko ustvarite dve skupini: eno za Apache in drugo za vse ostalo, in jedru poveste, da je vsaka skupina dodeljena, na primer 50 % procesorja, ne glede na število procesov, ki jih vzpostavijo.
Montiranje datotečnega sistema cpuset (cgroup v1)
V mnogih trenutnih distribucijah (Fedora, sodobni RHEL, systemdcgroups so privzeto nameščene in systemd samodejno združuje storitve. V starejših sistemih (na primer Ubuntu 12.04/14.04 s klasično konfiguracijo) lahko podsistem cpuset ročno namestite takole:
mount -t tmpfs -o size=5M cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/cpuset
mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset
S tem ste ustvarili majhen tmpfs Za shranjevanje hierarhij, imenik cpuset ki bo delovala kot točka priklopa in končno ste priklopili datotečni sistem cgroup omejeno na krmilnika CPU komplet.
Če pregledate /sys/fs/cgroup/cpuset Videli boste datoteke, kot so:
tasksycgroup.procs: seznami nalog in ID-jev skupin niti, ki pripadajo skupini.cpuset.cpusDovoljene procesorje za to skupino.cpuset.mems: dovoljena pomnilniška vozlišča.- Več dodatnih zastav:
cpuset.cpu_exclusive,cpuset.mem_exclusive,cpuset.memory_migrate, Itd
Ustvarjanje podskupin in dodeljevanje procesorjev/pomnilnika
Vsak poddirektorij, ki ga ustvarite v /sys/fs/cgroup/cpuset je nov nabor podrejenih procesorjevOdstranjevanje (če je prazno od opravil) se izvede z rmdirNa primer, če želite sistem razdeliti v dve skupini, eno na jedro:
cd /sys/fs/cgroup/cpuset
mkdir grupo-A grupo-B
echo 0 > grupo-A/cpuset.cpus
echo 1 > grupo-B/cpuset.cpus
echo 0 > grupo-A/cpuset.mems
echo 0 > grupo-B/cpuset.mems
Ustvarili ste dva sklopa procesorjev, skupina A y skupina BPrvi uporablja samo CPU 0, drugi pa CPU 1. Oba si delita eno samo pomnilniško vozlišče stroja, vozlišče 0.
Povezovanje procesov z naborom procesorjev
Če želite naloge postaviti v nabor procesorjev, preprosto zapišite svoj PID v datoteko tasks te skupine. Proces lahko pripada samo eni skupini znotraj določene hierarhije; ko ga premaknete, izgine s seznama nadrejenih skupin.
Recimo, da odprete dve novi lupini s PID-jema 3435 in 3492. Sprva bodo v korenskem naboru procesorjev.Podskupinam jih lahko pošljete takole:
echo 3435 > grupo-A/tasks
echo 3492 > grupo-B/tasks
Od tega trenutka naprej Vse, kar se zažene iz teh bash lupin, bo podedovalo njihov nabor procesorjev.Če zaženete štiri procese iz lupine 3435 consume_cpu (binarna datoteka, ki v zanki porabi veliko energije CPU-ja), v njej boste videli njene PID-e grupo-A/tasks in jedro 0 pri polni moči medtem ko jedro 1 skoraj nedejavno.
Če boste kasneje želeli enega od teh procesov "rešiti" in mu dati celotno jedro, lahko premaknite svoj PID v sorodni CPU nabor:
echo 3621 > /sys/fs/cgroup/cpuset/grupo-B/tasks
Pri opazovanju z topVideli boste, kako Oba procesorja začneta delovati, premaknjeni proces pa zasede večino CPU 1, medtem ko ostali trije porabijo CPU 0.
Drugi razpoložljivi krmilniki cgroup
cpuset je le en del sestavljanke. cgroups vključuje več krmilnikov, ki jih je mogoče uporabljati skupaj za zelo dobro upravljanje virov:
cpuTo nadzoruje delež procesorskega časa, dodeljenega vsaki skupini. Na primer, ena skupina ima 80 % procesorskega časa, druga 15 % in tretja 5 %.cpuacctNe omejuje, ampak samo štetja čas CPU, ki ga porabijo naloge skupine in njihovi potomci.blkio: regulira pasovno širino V/I na blokovnih napravah s sorazmernimi kvotami ali trdimi omejitvami.memory: nalaga omejitve RAM-a in swap-a ter poroča o porabi pomnilnika po skupinah.devices: dovoljuje ali zavrača dostop do določene naprave (na primer zaklepanje blokovne naprave na vsebnik).freezer: začasno ustavi ali nadaljuje vse naloge skupine.net_clsynet_prioOznačujejo omrežni promet ali prilagajajo prioritete na vmesnik za integracijo ztc.ns: združuje procese v različne imenske prostore, kar je uporabno za lahko virtualizacijo v kombinaciji z imenskimi prostori.perf_event: omogoča spremljanje nalog kontrolne skupine z orodjemperf.
Notranje podrobnosti o procesorskih sklopih v jedru
Na ravni jedra vsaka naloga vzdržuje kazalec na strukturo cgroup, ki ji pripada. Cpusets definirajo Maske CPU in pomnilniških vozlišč ki se sekajo z maskami afinitete in politikami NUMA, ki jih zahteva naloga.
Nekaj ključnih točk izvedbe:
- El korenski nabor procesorjev Vsebuje vsa pomnilniška jedra in vozlišča sistema.
- Vsak podrejeni nabor procesorjev mora biti stroga podmnožica iz očetovih sredstev.
- Komplet procesorjev je lahko označen kot exclusivo za procesor (
cpuset.cpu_exclusive) ali pomnilnik (cpuset.mem_exclusive): v tem primeru se njihovi viri ne morejo prekrivati z viri njihovih HERMANOS (da, s predniki ali potomci). - Novi sistemski klici se ne dodajajo: vse se obravnava prek datotečni sistem cgroup in virtualne datoteke, kot so
cpuset.cpus,tasks, Itd
Jedro povezuje procesorje v več nekritičnih točk za delovanje:
- Init: inicializira korenski procesor ob zagonu.
- razcep/izhod: dedovanje in sprostitev članstva v procesorskih naborih.
sched_setaffinity(): maskira afiniteto z masko, ki jo dovoljuje procesor.- Dodeljevalec pomnilnika: omeji strani na dovoljena vozlišča.
- Obnovitev spomina in migracija nalog: omejitve procesorja se spoštujejo, kolikor je to mogoče.
Pomembne zastavice in datoteke procesorja cpuset
Vsak sklop procesorjev ima poleg tega še cpuset.cpus y cpuset.mems, En niz konfiguracijskih datotek ki nadzorujejo napredno vedenje:
cpuset.memory_migrateČe je nastavljeno na 1, pri spreminjanju nabora procesorjev ali spreminjanjumemsObstoječe strani so migrirati do novih vozlišč, pri čemer čim bolj upoštevajte njihov relativni položaj.cpuset.mem_hardwallycpuset.mem_exclusiveKo so aktivirani, utrdijo pomnilniško oviro in omejijo celo nekatere skupne rezerve jedra.cpuset.memory_pressureycpuset.memory_pressure_enabledIzpostavijo mero pritiska na pomnilnik (neposredne povračila na sekundo) z drsečim povprečjem, kar je uporabno za orkestratorje in paketne razporejevalnike.cpuset.memory_spread_pageycpuset.memory_spread_slabČe je omogočeno, jedro distribuira strani predpomnilnika datotek in določene slabe. v krožnem načinu dovoljenih vozlišč, namesto da bi vedno dajali prednost lokalnemu vozlišču.cpuset.sched_load_balance: nadzoruje, ali razporejevalnik poskuša uravnotežiti obremenitev med procesorji v naboru procesorjev.cpuset.sched_relax_domain_level: prilagodi obseg (vtičnico, vozlišče, celoten sistem) določenih operacij selitve nalog znotraj domen načrtovanja.
Poleg tega boste v korenskem naboru procesorjev našli cpuset.effective_cpus y cpuset.effective_memski odražajo dejansko uporabne vire, upoštevajoč dogodke vklopa procesorja/pomnilnika. V posebnem načinu cpuset_v2_modeTe datoteke se lahko razlikujejo od cpuset.cpus y cpuset.mems da se ohrani vedenje, ki je bolj podobno tistemu pri cgroup v2.
Interakcija z razporejevalnikom: sched_load_balance in sched_relax_domain_level
Razporejevalnik Linuxa razdeli sistem na domene načrtovanja da se zmanjšajo stroški uravnoteženja obremenitve. Uravnoteženje obremenitve med številnimi jedri je drago, zato se običajno izvaja v skupinah (na vtičnico, na vozlišče itd.).
Zastava cpuset.sched_load_balance Ta nastavitev določa, ali morajo biti procesorji v tem naboru procesorjev v isti domeni, da lahko razporejevalnik prosto premika naloge znotraj njega. Če to nastavitev onemogočite v korenskem naboru procesorjev in jo omogočite le v nekaterih podrejenih naborih procesorjev, lahko preprečite nepotrebno uravnoteženje obremenitve procesorjev, rezerviranih za delo v realnem času ali zelo specifične delovne obremenitve.
Datoteka cpuset.sched_relax_domain_level omogoča vam, da prilagodite, kako daleč lahko razporejevalnik pogleda, ko:
- Naloga se prebudi in poskuša se jo postaviti v bližnje prosto jedro.
- En procesor ostane brez dela in prevzame naloge od bolj obremenjenih procesorjev.
Tipične vrednosti (odvisno od arhitekture) segajo od 0 (ne iščite) dokler 5 (iskanje na ravni celotnega sistema v sistemih NUMA), z vmesnimi ravnmi za sorojence HT, jedra istega vtičnika, vozlišča itd. Gre za podrobno orodje, ki ga je treba uporabljati le, če vam je zelo jasno, kakšen bo vpliv na latence in predpomnilnike.
Kako uporabljati procesorske sklope v praksi: tipičen potek
Potek dela Za vsebovanje "opravila" ali storitve znotraj določenega nabora procesorjev je običajno:
- Prepričajte se, da imate nameščen datotečni sistem cgroup/cpuset (v1 ali v2).
- Ustvarite komplet procesorjev z
mkdirv ustrezni hierarhiji. - Konfiguriraj
cpuset.cpusycpuset.memspreden dodaš naloge. - Po želji omogočite zastavice, kot so
memory_migrateocpu_exclusive. - Zaženi "nadrejeni" postopek za nalaganje in premakni svoj PID v nabor CPU-ja zapisovanje v
tasksocgroup.procs. - Zaženi (ali dovoli zagon) podrejene procese od tega nadrejenega; podedovali bodo njihovo članstvo v procesorju.
Če uporabljate orodja uporabniškega prostora kot cgroup-bin / libcgroup (v Debianu/Ubuntuju) ali ekvivalenti v drugih distribucijah, lahko to lažje uredite z ukazi Tip cgcreate, cgexec y cgclassifyali celo s konfiguracijskimi datotekami, kot so /etc/cgconfig.conf y /etc/cgrules.conf za dodelitev skupin na podlagi uporabnika ali ukaza.
cgroups v1 proti cgroups v2: Gonilniki CPU in CPUset v RHEL 8 in podobnih sistemih
V sodobnih postavitvah, kot je npr. RHEL 8jedro hkrati podpira c-skupini v1 in v2Privzeto je v RHEL 8 v1 nameščen na škorenjVendar pa lahko uporabo poenotenega načina (v2) vsilite s parametri jedra:
cgroup_no_v1=all: onemogoči vse krmilnike v1 ob zagonu.systemd.unified_cgroup_hierarchy=1: pove systemd, naj kot primarno hierarhijo uporabi cgroup v2.
Po spremembi in ponovnem zagonu lahko preverite z mount o findmnt da ni več nobenih vrst sklopov cgroup klasike (razen notranjih komponent systemd) in ročno sestavljanje drevesa v2, na primer v /cgroups-v2:
mount -t cgroup2 none /cgroups-v2
V tem korenskem imeniku (korenska kontrolna skupina) videli boste generične datoteke, ki se začnejo z cgroup.* in drugi specifični krmilniki, ki so tam aktivni, kot so cpuset.cpus.effective o cpu.max.
Omeji CPU s cgroup v2: gonilnik CPU in cpuset skupaj
V različici 2 delamo z edinstveno drevo in krmilnike aktivira poddrevo z uporabo datoteke cgroup.subtree_controlTipičen potek dela za omejevanje uporabe procesorja na nekaj procesov bi bil:
- Aktivirajte gonilnike
cpuycpusetza neposredne otroke koren pisanje v/cgroups-v2/cgroup.subtree_controlNekaj kot+cpu +cpuset. - Ustvarite podskupino, na primer
/cgroups-v2/Example/, Zmkdir. - Preverite, ali so datoteke, kot so
cpu.maxycpuset.cpus. - Prilagodite
cpuset.cpusycpuset.memsda se zagotovi, da bodo procesi tekmovali na istih CPU-jih/vozliščih (krmilniku)cpuTo velja le, če na istem procesorju tekmujeta vsaj dva procesa. - Konfiguriraj
cpu.maxs provizijo in piko, na primer:
echo "200000 1000000" > /cgroups-v2/Example/cpu.max
V tem primeru vsi procesi skupine Skupno bodo lahko porabili le 0,2 sekunde procesorskega časa na sekundo. naravno. Preostali čas bodo zadavljene do naslednje menstruacije.
Potem obstaja samo dodajte PID-e želenih prijav skupini tako, da jih zapišete /cgroups-v2/Example/cgroup.procsČe sta na primer v tej skupini dva intenzivna procesa (PID-a 5439 in 5473), bo vsak končal okoli 10 % procesorjaker si delijo 20-odstotno kvoto, ki ste jo določili.
Druga orodja za razumevanje procesorja, afinitete in strojne opreme v Linuxu
Za delo s procesorji je zelo koristno dobro razumevanje Topologija procesorja in stanje procesorja v vašem sistemu. Linux ponuja veliko ukazov, psevdo-datotek in orodij, kot so CPU-X za Linux ki zagotavljajo podrobne informacije:
lscpuNa zelo berljiv način prikazuje arhitekturo, število logičnih in fizičnih procesorjev, vtičnice, hipernitnost, predpomnilnike, podporo za virtualizacijo itd./proc/cpuinfo: razkrije podrobne informacije po logiki CPU: model, družina, koraki, mikrokoda, zastavice funkcij (SSE, AVX, VT-x, AMD-V, NX itd.)./sys/devices/system/cpu/zelo bogata struktura imenikov z enim podimenikom na CPU (cpu0,cpu1, …) in drugi za cpufreq, cpuidle, mikrokoda, topologija, Itd
Znotraj /sys/devices/system/cpu/cpu0/cpufreq/ Lahko vidite na primer: (in za več podrobnosti, Kako ugotoviti frekvenco procesorja).
cpuinfo_cur_freq: trenutna frekvenca.scaling_max_freqyscaling_min_freq: omejitve, znotraj katerih se lahko cpufreq prilagaja.scaling_governoraktivna politika (performance, varčevanje z energijo, ondemand, Itd.)scaling_available_governorsyscaling_driver: načini in uporabljeni gonilnik (na primer,intel_pstate).
En /sys/devices/system/cpu/cpu0/cpuidle/ Videli boste stanja počitka (state0, state1, …) z zakasnitvami in porabo, ki jih obravnava podsistem cpuidleTo, skupaj z frekvenca procesorja In razporejevalnik se glede na obremenitev odloči, kdaj bo izklopil jedra ali znižal frekvence za varčevanje z energijo.
En mobile začne se uporabljati Energetsko ozaveščeno načrtovanje (EAS), ki inteligentneje poenoti odločitve cpuidle, cpufreq in razporejevalnika, da se izognemo nedoslednostim, kot je prebujanje izklopljenih jeder, ko so na voljo druga aktivna jedra.
Merjenje in spremljanje uporabe procesorja po procesih in skupinah
Ko delate s kompleti procesorjev in gonilniki procesorjev, potrebujete orodja za preverite, ali ima to, kar ste konfigurirali, kakšen učinekNa primer, če je virtualni stroj, kot je VirtualBox porabi preveč procesorjaNekatere zelo pogoste možnosti so:
topDinamični sistemski pogled s skupno porabo CPE-ja, na CPE in na proces. Polje % CPU Omogoča vam, da vidite, katera opravila preobremenjujejo sistem.mpstat(iz paketa)sysstat): Statistika CPU-ja in agregatna statistika, uporabna za ogled porazdelitve obremenitve in časov nedejavnosti (nedejavnost, čakanje na io, krajo itd.).psv kombinaciji zsortNaštejete lahko procese, ki porabljajo največ procesorja, na primer:
ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10
Poleg tega računovodske datoteke, kot so cpuacct.usage y cpuacct.usage_percpu (v v1) ali vgrajeni števci v cgroup v2 vam sporočajo, koliko procesorja je določena skupina porabila od svoje ustanovitve, kar je idealno za interno obračunavanje ali primerjavo vpliva različnih aplikacij.
Navsezadnje vam procesorski nabori in kontrolne skupine omogočajo, da modelirajte svoj stroj kot niz "otokov" virovdodeljevanje nalog in sproti prilagajanje porazdelitve CPU-ja, pomnilnika in V/I-ja. Temeljito razumevanje datotek /sys/fs/cgroup in /sys/devices/system/cpuskupaj z orodji za spremljanje omogoča prehod od "zgolj spremljanja delovanja strežnika" do zelo natančnega nadzora nad tem, kaj se kje izvaja, koliko porablja in kako lahko izboljšate njegovo delovanje, ko je obremenitev prevelika.
Strasten pisec o svetu bajtov in tehnologije nasploh. Rad delim svoje znanje s pisanjem in to je tisto, kar bom počel v tem blogu, saj vam bom pokazal vse najbolj zanimive stvari o pripomočkih, programski opremi, strojni opremi, tehnoloških trendih in še več. Moj cilj je, da vam pomagam krmariti po digitalnem svetu na preprost in zabaven način.
