Natrag na blog

Upravljajte Docker resursima pomoću Cgroups

Upravljajte Docker resursima pomoću Cgroups

Prošlog mjeseca sam govorio na ApacheConu o Cgroupsima. Čini se da je vrlo malo korisnika Linuxa (uključujući i moju malenkost do ne tako davno) upoznato s Cgroupsima i njihovom snagom. To je šteta, jer su Cgroupsi vrlo moćni i omogućuju vam dodjelu resursa na vašim poslužiteljima na daleko detaljniji način od bilo kojeg drugog alata dostupnog u Linuxovom paketu alata. Štoviše, ugrađeni su izravno u kernel i dolaze spremni za rad s većinom Linux distribucija.

U ovom članku pokrit ću kako koristiti Cgroups s Dockerom kao svojevrsni nastavak na još jedno predavanje koje sam održao na Docker Meetup u Austinu, Teksas.

Ovaj članak zahtijeva osnovno razumijevanje Cgroupsa. Ako ste potpuno novi u Cgroupsima, preporučujem da pogledate moju prezentaciju s ApacheCona kao i resurse na kraju. Ipak, ne brinite, nećemo ulaziti preduboko. Ako samo preletite preko prezentacije, trebali biste moći pohvatati osnovne pojmove.

Docker i Cgroups

Docker dolazi s dva različita upravljačka programa: LXC i libcontainer. LXC upravljački program je zastarjeli upravljački program, a libcontainer je novi i zadani upravljački program. U većini slučajeva, libcontainer je preferirani upravljački program, jer se tamo događaju inovacije (na primjer docker exec ne radi s LXC upravljačkim programom).

Međutim, važno je napomenuti da postoje dva različita upravljačka programa, jer sve mogućnosti Cgroupa još nisu prenesene u libcontainer (ili barem izložene Dockeru). Kada koristite LXC upravljački program, jednostavno izravno prosljeđujete LXC argumente, dok su kod libcontainera eksplicitni argumenti Cgroup pravila izloženi Dockeru. Morat ćete eksplicitno postaviti upravljački program kada pokrećete Docker daemon, tako da ne možete pokrenuti dva upravljačka programa istovremeno.

Evo primjera kako to možete provjeriti:

[bash light=”true”] # S LXC upravljačkim programom
$ docker run -d –name=’lxc_test’ \
–lxc-conf="lxc.cgroup.cpu.shares=50" \
busybox

# S libcontainer upravljačkim programom
$ docker run -d –name=’libcontainer_test’ \
–cpu-shares=50 \
busybox
[/bash]

Evo pregleda nekih značajki Cgroupa i kako se one mapiraju između dva upravljačka programa:

Značajka Libcontainer LXC
Relativni udio procesora (CPU) -c, –cpu-shares –lxc-conf=”lxc.cgroup.cpu.shares”
Zaključaj na CPU jezgru –cpuset-cpus –lxc-conf=”lxc.cgroup.cpuset.cpus”
Ograniči memoriju -m, –memory –lxc-conf=”lxc.cgroup.cpuset.mems”

LXC

Ako želite koristiti LXC upravljački program za Docker, prvo ćete ga morati omogućiti. Metoda za to će se razlikovati ovisno o vašoj Linux distribuciji, ali evo uputa o tome kako omogućiti LXC upravljački program na Ubuntu 14.04.

Kao što je gore spomenuto, time se odričete niza značajki. Stoga, osim ako vam stvarno ne treba funkcionalnost koja još nije izložena u Dockeru pomoću libcontainera, trebali biste se držati zadanog upravljačkog programa.

Neka korisna Cgroup pravila koja tek trebaju biti izložena u libcontaineru uključuju prigušivanje I/O-a (pokriveno u prezentaciji), što može biti vrlo korisno za određene aplikacije.

Ako ste odlučili koristiti LXC upravljački program, dodavanje argumenata je jednostavno. Sve što trebate učiniti je dodati argument --lxc-conf i proslijediti Cgroup pravilo koje želite postaviti.

Libcontainer

Kao što možete vidjeti u gornjoj tablici, osnovna Cgroup pravila već su izložena u trenutnoj verziji Dockera (1.6 u vrijeme pisanja ovog teksta).

Korištenje ovih pravila vrlo je jednostavno. Ako na primjer želite zaključati Docker kontejner na prvu CPU jezgru, dodali biste --cpuset-cpus=0 svom docker run naredbi.

Također možete koristiti --cgroup-parent argument s libcontainerom i ručno postaviti detaljnija ograničenja resursa. Zatim biste ga mapirali u tu grupu pomoću tog argumenta.

Demo: Docker s Cgroupsima

U screencastu u nastavku koristit ćemo dva Docker spremnika (‘low_prio’ i ‘high_prio’). Koristimo osnovni spremnik ‘busybox’ i pokrećemo md5sum /dev/urandom kako bismo simulirali proces koji troši puno CPU-a. Prema zadanim postavkama, to bi potrošilo sve dostupne CPU resurse. Međutim, primijenit ćemo dva Cgroup pravila za upravljanje resursima. Prvo koristimo ‘cpuset.cpus’ kako bismo zaključali spremnike na istu CPU jezgru (jezgra 0).

Zatim koristimo ‘cpu.shares’ za dodjelu relativnog udjela CPU-a. Spremniku ‘low_prio’ dajemo vrijednost 20, a ‘high_prio’ vrijednost 80. To znači da će 20% CPU-a biti dodijeljeno spremniku ‘low_prio’, a 80% CPU-a spremniku ‘high_prio’. Napominjemo, međutim, da je relativni udio proizvoljna ljestvica (mogli smo koristiti i vrijednosti 2 i 8).

Nakon što pokažemo da upravljanje resursima doista radi, pokrenut ćemo isti skup spremnika bez ikakvih Cgroup pravila kako bismo vidjeli kako se ponašaju.

Kao referenca, evo naredbi koje se koriste za pokretanje spremnika.

[bash light=”true”] $ docker run -d \
–name=’low_prio’ \
–cpuset-cpus=0 \
–cpu-shares=20 \
busybox md5sum /dev/urandom
$ docker run -d \
–name=’high_prio’ \
–cpuset-cpus=0 \
–cpu-shares=80 \
busybox md5sum /dev/urandom
[/bash]

Sažetak

Ako upravljate s više Docker spremnika na istom hostu, korištenje Cgroups za upravljanje resursima između spremnika ima puno smisla. Na primjer, možda imate neke pozadinske zadatke obrade koji se izvode u jednom spremniku, a drugi spremnik poslužuje korisnički sadržaj. U tom slučaju možete iskoristiti svoje novostečeno znanje kako biste osigurali da date prioritet spremnicima okrenutim korisnicima u odnosu na pozadinske zadatke.

author

Viktor Petersson

Autor · CloudSigma

Preslav Dobrev je kreativni dizajner u CloudSigma, usredotočen na dosljedan poslovni identitet korištenjem tradicionalnih i inovativnih marketinških kanala. Vješt je u spajanju umjetničke vizije sa strateškim marketingom kako bi stvorio dojmljive brendirane priče.

Komentari

Još nema komentara. Budite prvi.