Zpět na blog

Spravujte prostředky Dockeru pomocí Cgroups

Spravujte prostředky Dockeru pomocí Cgroups

Minulý měsíc jsem mluvil na ApacheConu o Cgroups. Zdá se, že jen velmi málo uživatelů Linuxu (včetně mě samotného až do nedávné doby) zná Cgroups a jejich sílu. To je škoda, protože Cgroups jsou velmi mocné a umožňují vám přidělovat prostředky na vašich serverech mnohem podrobnějším způsobem než jakýkoli jiný nástroj dostupný v sadě nástrojů Linuxu. Navíc je to vestavěno přímo do jádra a je to součástí většiny linuxových distribucí hned po instalaci.

V tomto článku se budu zabývat tím, jak používat Cgroups s Dockerem, což je tak trochu navázání na další přednášku, kterou jsem měl na Docker Meetup v Austinu v Texasu.

Tento článek vyžaduje základní porozumění Cgroups. Pokud jste v Cgroups úplnými nováčky, doporučuji vám prohlédnout si mou prezentaci z ApacheConu a také zdroje na konci. Ale nebojte se, nepůjdeme příliš do hloubky. Pokud prezentaci jen zběžně proletíte, měli byste pochopit základní koncepty.

Docker a Cgroups

Docker přichází se dvěma různými ovladači: LXC a libcontainer. Ovladač LXC je starší ovladač a libcontainer je nový a výchozí ovladač. Ve většině případů je preferovaným ovladačem libcontainer, protože právě tam dochází k inovacím (například docker exec s ovladačem LXC nefunguje).

Je však důležité poznamenat, že existují dva různé ovladače, protože ne všechny funkce Cgroup byly dosud portovány do libcontaineru (nebo alespoň zpřístupněny v Dockeru). Při použití ovladače LXC jednoduše předáváte argumenty LXC přímo, zatímco u libcontaineru jsou Dockeru vystaveny explicitní argumenty zásad Cgroup. Při spuštění démona Docker budete muset explicitně nastavit ovladač, takže nemůžete spustit oba ovladače současně.

Zde je příklad, jak to můžete zkontrolovat:

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

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

Zde je přehled některých funkcí Cgroup a toho, jak se mapují mezi těmito dvěma ovladači:

Funkce Libcontainer LXC
Relativní sdílení CPU -c, –cpu-shares –lxc-conf=”lxc.cgroup.cpu.shares”
Uzamčení na jádro CPU –cpuset-cpus –lxc-conf=”lxc.cgroup.cpuset.cpus”
Omezení paměti -m, –memory –lxc-conf=”lxc.cgroup.cpuset.mems”

LXC

Pokud chcete použít ovladač LXC pro Docker, budete jej muset nejprve povolit. Metoda, jak to provést, se bude lišit v závislosti na vaší linuxové distribuci, ale zde jsou pokyny, jak povolit ovladač LXC na Ubuntu 14.04.

Jak bylo zmíněno výše, tímto se vzdáváte řady funkcí. Proto, pokud opravdu nepotřebujete funkcionalitu, která v Dockeru pomocí libcontaineru ještě není zpřístupněna, měli byste se opravdu držet výchozího ovladače.

Některé užitečné zásady Cgroup, které v libcontaineru ještě nejsou zpřístupněny, zahrnují omezování I/O (popsané v prezentaci), což může být pro určité aplikace velmi užitečné.

Pokud jste se rozhodli použít ovladač LXC, přidávání argumentů je jednoduché. Jediné, co musíte udělat, je přidat argument --lxc-conf a předat zásadu Cgroup, kterou chcete nastavit.

Libcontainer

Jak můžete vidět v tabulce výše, základní zásady Cgroup jsou již v aktuální verzi Dockeru (1.6 v době psaní tohoto článku) zpřístupněny.

Použití těchto zásad je velmi jednoduché. Pokud chcete například uzamknout kontejner Dockeru na první jádro CPU, připojili byste --cpuset-cpus=0 k vašemu příkazu docker run.

Můžete také použít argument --cgroup-parent s libcontainerem a ručně nastavit podrobnější omezení prostředků. Poté byste jej namapovali na tuto skupinu pomocí argumentu.

Demo: Docker s Cgroups

V níže uvedeném screencastu použijeme dva Docker kontejnery (‘low_prio’ a ‘high_prio’). Použijeme základní kontejner ‘busybox’ a spustíme md5sum /dev/urandom k simulaci procesu náročného na CPU. Ve výchozím nastavení by to spotřebovalo všechny dostupné prostředky CPU. Použijeme však dvě politiky Cgroup pro správu prostředků. Nejprve použijeme ‘cpuset.cpus’ k uzamčení kontejnerů na stejné jádro CPU (jádro 0).

Dále použijeme ‘cpu.shares’ k přiřazení relativního podílu CPU. Kontejneru ‘low_prio’ přidělíme hodnotu 20 a ‘high_prio’ hodnotu 80. To znamená, že 20 % CPU bude přiděleno kontejneru ‘low_prio’ a 80 % CPU bude přiděleno kontejneru ‘high_prio’. Vezměte prosím na vědomí, že relativní podíl je libovolná stupnice (jako hodnoty jsme mohli stejně tak použít 2 a 8).

Poté, co předvedeme, že správa prostředků skutečně funguje, spustíme stejnou sadu kontejnerů bez jakýchkoli politik Cgroup, abychom viděli, jak se chovají.

Pro referenci uvádíme příkazy použité ke spuštění kontejnerů.

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

Shrnutí

Pokud spravujete více Docker kontejnerů na stejném hostiteli, dává použití Cgroups ke správě prostředků mezi kontejnery velký smysl. Například můžete mít v jednom kontejneru spuštěné nějaké úlohy zpracování na pozadí a v jiném kontejneru poskytovat obsah uživatelům. V takovém případě můžete využít své nově nabyté znalosti k tomu, abyste zajistili, že upřednostníte kontejnery určené pro uživatele před úlohami na pozadí.

author

Viktor Petersson

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.