Späť na blog

Spravujte zdroje Dockeru pomocou Cgroups

Spravujte zdroje Dockeru pomocou Cgroups

Minulý mesiac som hovoril na ApacheCon o Cgroups. Zdá sa, že len málokto z používateľov Linuxu (vrátane mňa samého až do nedávna) pozná Cgroups a ich silu. To je škoda, pretože Cgroups sú veľmi výkonné a umožňujú vám prideľovať prostriedky na vašich serveroch oveľa detailnejším spôsobom než akýkoľvek iný nástroj dostupný v linuxovej výbave. Navyše sú zabudované priamo v jadre a prichádzajú out-of-the-box s väčšinou distribúcií Linuxu.

V tomto článku sa budem venovať tomu, ako používať Cgroups s Dockerom, ako určité nadviazanie na moju ďalšiu prednášku, ktorú som mal na Docker Meetup v Austine v Texase.

Tento článok vyžaduje základné pochopenie Cgroups. Ak ste v Cgroups úplne noví, odporúčam vám pozrieť si moju prezentáciu z ApacheCon, ako aj zdroje na konci. Nemajte však obavy, nepôjdeme príliš do hĺbky. Ak len zbežne preletíte prezentáciu, mali by ste pochopiť základné koncepty.

Docker a Cgroups

Docker prichádza s dvoma rôznymi ovládačmi: LXC a libcontainer. Ovládač LXC je starší ovládač a libcontainer je nový a predvolený ovládač. Vo väčšine prípadov je preferovaným ovládačom libcontainer, pretože práve tam prebiehajú inovácie (napríklad docker exec nefunguje s ovládačom LXC).

Je však dôležité poznamenať, že existujú dva rôzne ovládače, pretože nie všetky funkcie Cgroup boli doteraz portované do libcontainer (alebo aspoň sprístupnené pre Docker). Pri použití ovládača LXC jednoducho odovzdávate argumenty LXC priamo, zatiaľ čo pri libcontainer sú pre Docker sprístupnené explicitné argumenty politiky Cgroup. Pri spustení démona Docker budete musieť explicitne nastaviť ovládač, takže nemôžete spustiť oba ovládače súčasne.

Tu je príklad, ako to môžete skontrolovať:

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

# S ovládačom libcontainer
$ docker run -d –name=’libcontainer_test’ \
–cpu-shares=50 \
busybox
[/bash]

Tu je prehľad niektorých funkcií Cgroup a ich mapovanie medzi týmito dvoma ovládačmi:

Funkcia Libcontainer LXC
Relatívny podiel CPU -c, –cpu-shares –lxc-conf=”lxc.cgroup.cpu.shares”
Uzamknutie na jadro CPU –cpuset-cpus –lxc-conf=”lxc.cgroup.cpuset.cpus”
Limit pamäte -m, –memory –lxc-conf=”lxc.cgroup.cpuset.mems”

LXC

Ak chcete pre Docker použiť ovládač LXC, musíte ho najprv povoliť. Spôsob, ako to urobiť, sa bude líšiť v závislosti od vašej distribúcie Linuxu, ale tu sú pokyny na ako povoliť ovládač LXC na Ubuntu 14.04.

Ako bolo spomenuté vyššie, týmto sa vzdávate viacerých funkcií. Preto, pokiaľ naozaj nepotrebujete funkciu, ktorá ešte nie je v Dockeri pomocou libcontainer sprístupnená, mali by ste sa naozaj držať predvoleného ovládača.

Niektoré užitočné politiky Cgroup, ktoré ešte nie sú v libcontainer sprístupnené, zahŕňajú obmedzovanie I/O (popísané v prezentácii), čo môže byť pre určité aplikácie veľmi užitočné.

Ak ste sa rozhodli použiť ovládač LXC, pridávanie argumentov je jednoduché. Stačí pridať argument --lxc-conf a odovzdať politiku Cgroup, ktorú by ste chceli nastaviť.

Libcontainer

Ako môžete vidieť v tabuľke vyššie, základné politiky Cgroup sú už sprístupnené v aktuálnej verzii Dockeru (1.6 v čase písania tohto článku).

Používanie týchto politík je veľmi jednoduché. Ak chcete napríklad uzamknúť Docker kontajner na prvé jadro CPU, pridali by ste --cpuset-cpus=0 k vášmu príkazu docker run command.

Môžete tiež použiť argument --cgroup-parent s libcontainer a manuálne nastaviť podrobnejšie obmedzenia prostriedkov. Potom by ste ho namapovali na túto skupinu pomocou tohto argumentu.

Demo: Docker s Cgroups

V screencaste nižšie použijeme dva Docker kontajnery (‘low_prio’ a ‘high_prio’). Použijeme základný kontajner ‘busybox’ a spustíme md5sum /dev/urandom na simuláciu procesu náročného na CPU. V predvolenom nastavení by to spotrebovalo všetky dostupné zdroje CPU. Použijeme však dve pravidlá Cgroup na správu zdrojov. Najprv použijeme ‘cpuset.cpus’ na uzamknutie kontajnerov na rovnaké jadro CPU (jadro 0).

Ďalej použijeme ‘cpu.shares’ na priradenie relatívneho podielu CPU. Kontajneru ‘low_prio’ priradíme hodnotu 20 a ‘high_prio’ hodnotu 80. To znamená, že 20 % CPU bude pridelených kontajneru ‘low_prio’ a 80 % CPU bude pridelených kontajneru ‘high_prio’. Upozorňujeme však, že relatívny podiel je ľubovoľná mierka (rovnako dobre sme mohli použiť hodnoty 2 a 8).

Po tom, čo sme demonštrovali, že správa zdrojov skutočne funguje, spustíme rovnakú sadu kontajnerov bez akýchkoľvek pravidiel Cgroup, aby sme videli, ako sa správajú.

Pre referenciu, tu sú príkazy použité na spustenie kontajnerov.

[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]

Zhrnutie

Ak spravujete viacero Docker kontajnerov na rovnakom hostiteľovi, používanie Cgroups na správu zdrojov medzi kontajnermi má veľký zmysel. Napríklad môžete mať v jednom kontajneri spustené nejaké úlohy spracovania na pozadí a iný kontajner poskytujúci obsah používateľom. V takom prípade môžete využiť svoje novonadobudnuté znalosti na to, aby ste zabezpečili, že uprednostníte kontajnery určené pre používateľov pred úlohami na pozadí.

author

Viktor Petersson

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.