Futásidejű opciók memóriával, CPU-kkal és GPU-kkal

Becsült olvasási idő: 16 perc

futásidejű

Alapértelmezés szerint a tárolónak nincsenek erőforrás-korlátai, és annyit használhat fel egy adott erőforrásból, amennyit a gazdagép kernelütemezője megenged. A Docker lehetőséget nyújt a tároló által felhasználható memória vagy CPU használatának ellenőrzésére, beállítva a docker run parancs futásidejű konfigurációs zászlóit. Ez a szakasz részleteket tartalmaz arról, hogy mikor kell beállítania az ilyen határértékeket, és azok meghatározásának lehetséges következményeit.

Ezen funkciók sokaságához a rendszermag szükséges a Linux képességeinek támogatásához. A támogatás ellenőrzéséhez használhatja a docker info parancsot. Ha a kernelben le van tiltva egy képesség, akkor a kimenet végén figyelmeztetést láthat, mint például:

Az engedélyezéshez olvassa el az operációs rendszer dokumentációját. Tudj meg többet.

memória

Értse meg a memória elfogyásának kockázatát

Fontos, hogy ne engedje, hogy egy futó tároló túl sokat használjon fel a gazdagép memóriájából. Linux-gazdagépeken, ha a rendszermag azt észleli, hogy nincs elegendő memória a fontos rendszerfunkciók végrehajtásához, OOME-ot, vagy Elfogyott a memória kivételét dobja, és megöli a folyamatokat a memória felszabadítása érdekében. Bármely folyamat megölhető, beleértve a Dockert és más fontos alkalmazásokat is. Ez hatékonyan leronthatja az egész rendszert, ha rossz folyamatot ölnek meg.

A Docker megkísérli enyhíteni ezeket a kockázatokat azáltal, hogy úgy módosítja az OOM prioritást a Docker démonon, hogy kevésbé valószínű, hogy elpusztul, mint a rendszer többi folyamata. A tárolók OOM prioritása nincs módosítva. Ez valószínűbbé teszi egy egyedi konténer megölését, mint a Docker démon vagy más rendszerfolyamatok megölését. Ne próbálja megkerülni ezeket a biztosítékokat úgy, hogy manuálisan beállítja a --oom-score-adj értéket egy rendkívül negatív számra a démonon vagy a tárolón, vagy a --oom-kill-disable beállítást egy tárolón.

A Linux kernel OOM kezelésével kapcsolatos további információkért lásd: Elfogyott a memóriakezelés.

Csökkentheti a rendszer instabilitásának kockázatát az OOME miatt:

  • A gyártásba helyezés előtt végezzen teszteket az alkalmazás memóriaigényének megértése érdekében.
  • Győződjön meg arról, hogy az alkalmazás csak megfelelő erőforrásokkal rendelkező gazdagépeken fut.
  • Korlátozza a tároló által felhasználható memória mennyiségét az alábbiak szerint.
  • Legyen körültekintő, amikor konfigurálja a cserét a Docker gazdagépeken. A csere lassabb és kevésbé teljesít, mint a memória, de puffert nyújthat a rendszermemória elfogyása ellen.
  • Fontolja meg a konténer szolgáltatásgá alakítását, valamint a szolgáltatási szintű korlátozások és csomópontcímkék használatát annak biztosítására, hogy az alkalmazás csak elegendő memóriával rendelkező gazdagépeken futjon

Korlátozza a tároló memóriához való hozzáférését

A Docker kikényszerítheti a merevlemez-korlátozásokat, amelyek lehetővé teszik a tároló számára, hogy egy adott felhasználói vagy rendszermemória-mennyiségnél többet használjon, vagy a soft limiteket, amelyek lehetővé teszik a tároló számára a szükséges memória használatát, hacsak bizonyos feltételek nem teljesülnek, például a kern kevés memóriát vagy versenyt észlel a gazdagépen. Ezen opciók némelyikének eltérő hatása van, ha önmagában használja, vagy ha egynél több opció van beállítva.

Ezen opciók többsége pozitív egész számot vesz fel, amelyet egy b, k, m, g utótag követ, a bájt, kilobájt, megabájt vagy gigabájt jelzésére.

A c-csoportokról és általában a memóriáról további információkat a Memory Resource Controller dokumentációjában talál.

--memóriacsere részletek

--A memory-swap egy módosító zászló, amelynek csak akkor van jelentése, ha a --memory is be van állítva. A csere használata lehetővé teszi a tároló számára, hogy a memóriaigényeket lemezre írja, amikor a tároló kimerítette az összes rendelkezésre álló RAM-ot. Teljesítménybüntetés vonatkozik azokra az alkalmazásokra, amelyek gyakran memóriát cserélnek lemezre.

Beállításának bonyolult hatásai lehetnek:

Ha a --memory-swap pozitív egész számra van állítva, akkor mind a --memory, mind a --memory-swap értéket be kell állítani. --memory-swap a felhasználható memória és swap teljes mennyiségét jelöli, a --memory pedig a nem swap memória által használt mennyiséget szabályozza. Tehát ha --memory = "300m" és --memory-swap = "1g", akkor a tároló 300m memóriát és 700m (1g - 300m) cserét használhat.

Ha a --memory-swap értéke 0, akkor a beállítást figyelmen kívül hagyjuk, és az értéket nem beállítottként kezeljük.

Ha a --memory-swap azonos értékre van állítva, mint a --memory, és a --memory pozitív egész számra van állítva, a tárolónak nincs hozzáférése a cseréhez. Lásd: A tároló cseréjének megakadályozása.

Ha a --memory-swap nincs beállítva, és a --memory be van állítva, akkor a tároló annyi cserét használhat, mint a --memory beállítás, ha a gazdagép tárolóban swap memória van konfigurálva. Például, ha a --memory = "300m" és a --memory-swap nincs beállítva, akkor a tároló összesen 600 m memóriát és cserét használhat.

Ha a --memory-swap kifejezetten -1 értékre van állítva, akkor a tároló korlátlan cserét használhat, a gazdagépen elérhető mennyiség erejéig.

A tároló belsejében az olyan eszközök, mint az ingyenes, nem a tároló belsejében elérhető, hanem a gazdagép elérhető cseréjét jelentik. Ne támaszkodjon ingyenes vagy hasonló eszközök kimenetére annak megállapításához, hogy van-e csereügylet.

Akadályozza meg, hogy egy konténer cseréljen

Ha a --memory és a --memory-swap azonos értékre van állítva, ez megakadályozza, hogy a tárolók bármilyen cserét használhassanak. Ez azért van, mert a --memory-swap a kombinált memória és a swap használható mennyisége, míg a --memory csak a felhasználható fizikai memória mennyisége.

--memória-swappiness részletek

  • A 0 érték kikapcsolja az anonim oldalcserét.
  • A 100 érték az összes névtelen oldalt felcserélhetővé teszi.
  • Alapértelmezés szerint, ha nem állítja be a --memory-swappiness beállítást, akkor az értéket a gazdagép örökli.

--kernel-memória részletei

A kernelmemória korlátai az összes tároló számára lefoglalt memóriában vannak kifejezve. Vegye figyelembe a következő forgatókönyveket:

  • Korlátlan memória, korlátlan kernelmemória: Ez az alapértelmezett viselkedés.
  • Korlátlan memória, korlátozott kernelmemória: Ez akkor megfelelő, ha az összes csoport számára szükséges memória mennyisége nagyobb, mint a gazdagépen ténylegesen létező memória mennyisége. Beállíthatja a kernelmemóriát úgy, hogy soha ne lépje át a gazdagépen elérhetőeket, és a több memóriát igénylő tárolóknak meg kell várniuk.
  • Korlátozott memória, korlátlan kernelmemória: A teljes memória korlátozott, de a kernelmemória nem.
  • Korlátozott memória, korlátozott kernelmemória: A felhasználói és a kern memória korlátozása egyaránt hasznos lehet a memóriával kapcsolatos problémák hibakeresésében. Ha egy tároló váratlan mennyiségű memóriát használ, akkor elfogy a memória anélkül, hogy más tárolókat vagy a gazdagépet érintené. Ezen a beállításon belül, ha a rendszermag memóriakorlátja alacsonyabb, mint a felhasználói memóriakorlát, a kernelmemória elfogyása OOM hibát okoz a tárolónak. Ha a kernel memória korlátja meghaladja a felhasználói memória korlátját, akkor a kernel korlátozása nem okozza a tároló OOM tapasztalatát.

Ha bekapcsol bármely kernelmemória-korlátot, a gazdagép folyamatonként követi a „magas vízjel” statisztikákat, így nyomon követheti, hogy mely folyamatok (ebben az esetben a konténerek) használnak felesleges memóriát. Ez folyamatonként látható a/proc/megtekintésével

/ állapot a gazdagépen.

Alapértelmezés szerint minden tároló korlátlan hozzáférést biztosít a gazdagép CPU-ciklusaihoz. Különböző korlátozásokkal állíthatja be, hogy korlátozzák az adott tároló hozzáférését a gazdagép CPU-ciklusaihoz. A legtöbb felhasználó az alapértelmezett CFS ütemezőt használja és konfigurálja. Beállíthatja a valós idejű ütemezőt is.

Konfigurálja az alapértelmezett CFS ütemezőt

A CFS a Linux kernel CPU ütemezője a normál Linux folyamatokhoz. Számos futásidejű jelző lehetővé teszi a tároló CPU-erőforrásaihoz való hozzáférés konfigurálását. Ha ezeket a beállításokat használja, a Docker módosítja a tároló cgroupjának beállításait a gazdagépen.

Ha 1 processzora van, az alábbi parancsok mindegyike másodpercenként a CPU legfeljebb 50% -át garantálja a tároló számára.

Ami egyenértékű a --cpu-period és --cpu-quota manuális megadásával;

Konfigurálja a valós idejű ütemezőt

Konfigurálhatja a tárolót a valós idejű ütemező használatára olyan feladatokhoz, amelyek nem használhatják a CFS ütemezőjét. A Docker démon vagy az egyes tárolók konfigurálása előtt meg kell győződnie arról, hogy a gazdagép rendszermagja megfelelően van-e konfigurálva.

A CPU ütemezése és a prioritások kiemelt kernel szintű szolgáltatások. A legtöbb felhasználónak nem kell megváltoztatnia ezeket az értékeket az alapértelmezett értékektől. Ha ezeket az értékeket helytelenül állítja be, akkor a gazdarendszere instabillá vagy használhatatlanná válhat.

Konfigurálja a gazdagép kerneljét

A zcat /proc/config.gz | futtatásával ellenőrizze, hogy a CONFIG_RT_GROUP_SCHED engedélyezve van-e a Linux kernelben. grep CONFIG_RT_GROUP_SCHED vagy a /sys/fs/cgroup/cpu.rt_runtime_us fájl létezésének ellenőrzésével. A kernel valós idejű ütemezőjének konfigurálásához olvassa el az operációs rendszer dokumentációját.

Konfigurálja a Docker démont

Ha a tárolókat a valós idejű ütemező segítségével szeretné futtatni, futtassa a Docker démonot úgy, hogy a --cpu-rt-runtime jelző a valós idejű feladatokhoz futtatott futásidőnként maximálisan fenntartott mikroszekundumszámra van beállítva. Például az alapértelmezett 1000000 mikroszekundum (1 másodperc) periódus mellett a --cpu-rt-runtime = 950000 beállítás biztosítja, hogy a valós idejű ütemezőt használó konténerek 950000 mikroszekundumot tudnak futtatni minden 1000000-mikroszekundumos periódus alatt, és legalább 50000 mikroszekundum maradjon elérhető nem valós idejű feladatokhoz. Ennek a konfigurációnak a systemd-t használó rendszereken való állandóvá tételéhez lásd: A Docker vezérlése és beállítása a systemd-vel.

Konfigurálja az egyes tárolókat

Több tárcsa átadásával szabályozhatja a tároló CPU-prioritását, amikor a tárolót dokkolófuttatással indítja. A megfelelő értékekről az operációs rendszer dokumentációjában vagy az ulimit parancsban tájékozódhat.

Opció leírása
--cap-add = sys_nice Megadja a tárolónak a CAP_SYS_NICE képességet, amely lehetővé teszi a tároló számára a folyamat szép értékeinek emelését, a valós idejű ütemezési házirendek, a CPU-affinitás és egyéb műveletek megadását.
--cpu-rt-futásidejű = A tároló futtatásának maximális száma mikroszekundumokat valós idejű prioritással a Docker démon valós idejű ütemezőjének időszakában. Szüksége van a --cap-add = sys_nice zászlóra is.
--ulimit rtprio = A tároló maximális valós idejű prioritása. Szüksége van a --cap-add = sys_nice zászlóra is.

A következő példa parancs e három zászló mindegyikét beállítja egy debianban: jessie container.

Ha a kernel vagy a Docker démon nincs megfelelően konfigurálva, hiba lép fel.

Nyissa meg az NVIDIA GPU-t

Előfeltételek

Látogasson el a hivatalos NVIDIA illesztőprogramok oldalára a megfelelő illesztőprogramok letöltéséhez és telepítéséhez. Indítsa újra a rendszert, miután ezt megtette.

Ellenőrizze, hogy a GPU fut-e és elérhető-e.

Telepítse az nvidia-container-runtime alkalmazást

Kövesse az alábbi utasításokat: (https://nvidia.github.io/nvidia-container-runtime/), majd futtassa a következő parancsot:

Győződjön meg arról, hogy az nvidia-container-runtime-hook elérhető a $ PATH-ról .

Indítsa újra a Docker démont.

Tegye ki a GPU-kat használatra

Tartalmazza a --gpus jelzőt, amikor tárolót indít a GPU erőforrások eléréséhez. Adja meg, hogy hány GPU-t használjon. Például:

Az összes rendelkezésre álló GPU-t kiteszi, és a következőhöz hasonló eredményt ad vissza:

Az eszköz opcióval adja meg a GPU-kat. Például:

Kiteszi azt a konkrét GPU-t.

Kiteszi az első és a harmadik GPU-t.

Az NVIDIA GPU-khoz csak egyetlen motort futtató rendszerek férhetnek hozzá.

Állítsa be az NVIDIA képességeit

A képességeket manuálisan is beállíthatja. Például az Ubuntuban a következőket futtathatja:

Ez lehetővé teszi a segédprogram-illesztőprogram képességét, amely hozzáadja az nvidia-smi eszközt a tárolóhoz.

A képességek és egyéb konfigurációk a környezeti változókon keresztül állíthatók be a képeken. Az érvényes változókról további információt az nvidia-container-runtime GitHub oldalon talál. Ezek a változók beállíthatók egy Dockerfile-ban.

CUDA képeket is felhasználhat, amelyek automatikusan beállítják ezeket a változókat. További információt a CUDA images GitHub oldalon talál.