Sytuacja kobiet w IT w 2024 roku
2.06.20203 min
Al-Waleed Shihadeh

Al-Waleed ShihadehTeam Lead & Product OwnerFidor Solutions

Jak ustawić limit zasobów dla usług Docker Swarm

Sprawdź, jak prawidłowo ustawić limit zasobów dla poszczególnych usług Docker Swarm, przy użyciu mechanizmów limits i reservations.

Jak ustawić limit zasobów dla usług Docker Swarm

W systemach Linux tzw. OOM killer (od Out of Memory) zabije każdy proces, który konsumuje więcej zasobów, takich jak RAM, niż jest dostępnych na hoście lub zostało przypisanych do procesu. Jest to spore niebezpieczeństwo dla usług, nie tylko w środowiskach produkcyjnych, ale także na środowiskach testowych, ponieważ oznacza to, że usługi przestaną działać z powodu zapotrzebowania na więcej zasobów.

Inną wadą tego zachowania jest to, że jeśli usługa może zużywać wszystkie zasoby na hoście, istnieje ryzyko, że wpłynie to na inne usługi działające na tym samym hoście.vOOM killer obserwuje wszystkie procesy lub usługi działające w systemach Linux, w tym demona Dockera i kontenery.

Możliwe jest zmniejszenie ryzyka, że jedna usługa lub proces zużyje wszystkie zasoby dostępne dla danego węzła i wpłynie na inne usługi na tym samym hoście, definiując ograniczenia zasobów dla demona Dockera i dla usług. Dzięki temu pomysłowi zarówno demon Dckera, jak i kontenery Dockera będą miały określone limity. OOM killer je uwzględni i zabije tylko procesy, które przekroczyły dostępne im limity.

Chociaż zgodnie z oficjalną dokumentacją można również ograniczyć zasoby w czasie działania Dockera, w tym artykule skupię się na ustawianiu limitów zasobów dla poszczególnych usług Docker Swarm. Docker Compose zapewnia dwie metody ograniczania zasobów przydzielonych dla poszczególnych usług Swarm i kontenerów. Poniżej znajduje się krótki opis tych metod.

Rezerwacja (ang. Reservations)

Ta metoda zarezerwuje przydzieloną ilość zasobów na Dockera w czasie uruchamiania kontenerów. Oznacza to, że w przypadku hosta z 16 GB pamięci RAM i przypisania 1 GB na każde zadanie, na tym hoście będzie można uruchomić maksymalnie 16 zadań.

Jeśli spróbujesz wdrożyć lub skalować usługi na tym hoście do ponad 16 zadań, wszystkie nowe zadania zostaną odrzucone i nie zostaną utworzone nowe kontenery, ponieważ na hoście nie będzie dostępnych zasobów. To będzie problemem, nawet jeśli 16 działających kontenerów zużywa tylko 5 GB.

Przyczyną tego jest to, że Docker zarezerwuje 1 GB RAM-u dla każdego zadania w zaplanowanym czasie i te zasoby przestaną być dostępne dla innych procesów na hoście. Dlatego zarezerwowane zasoby powinny być tak małe, jak to tylko możliwe. Ma to zagwarantować, że usługi będą mogły zostać uruchomione tak, jak zakładano. 

Z drugiej strony, zarezerwowane wielkości nie powinny blokować niepotrzebnych zasobów hosta i wpływać na harmonogram innych usług klastra Docker Swarm. Na przykład, nie zaleca się ustawiania wartości rezerwacji na 5GB dla usługi, która zużywa średnio 500MB. To oczywiste w przypadku, gdy marnujemy zasoby hosta przez zamykanie ich w obrębie określonej usługi. 

Limit

Metoda ta ustawia górny limit dla usług Dockera. Ustawianie limitu dla wszystkich usług zagwarantuje, że nie będzie żadnej usługi, bądź też kontenera, który może przekroczyć tego limitu i zużyć więcej zasobów hosta. Może to w rezultacie negatywnie wpłynąć na wydajność innych usług. 

Według dokumentacji Docker Compose, zarówno ograniczenia zasobów pamięci oraz procesora można ustawić indywidualnie w następujący sposób:

version: "3.7"
services:
    redis:
        image: redis:alpine
        deploy:
           resources:
               limits:
                 cpus: '0.50'
                 memory: 50M
          reservations:
             cpus: '0.25'
             memory: 20M

Podsumowanie

Ustawianie ograniczeń zużycia zasobów dla usług Swarm może pomóc w oddzieleniu ich od siebie, z punktu widzenia zasobów. Żadne usługi nie będą wtedy w stanie zdominować zużycia zasobów na hoście.  

<p>Loading...</p>