Docker / CPU ба memory хязгаарлалт

CPU ба memory хязгаарлалт

Хязгаарлалтгүй container нь хөрш container-уудын нөөцийг залгиж болно. Нэг апп санах ой дүүргэвэл бүх сервис унана. Нөөцийн хязгаарлалт тавих нь production-д заавал хийх ёстой.

Memory хязгаарлалт

bash
# 512MB хязгаарлалт
docker run -d --memory 512m --name myapp myimage

# 1GB
docker run -d --memory 1g --name myapp myimage

# Swap-тай хамт
docker run -d --memory 512m --memory-swap 1g --name myapp myimage

--memory-swap нь нийт санах ой + swap. Дээрх жишээнд:

  • RAM: 512MB
  • Swap: 512MB (нийт 1GB — RAM)

Swap унтраах:

bash
docker run -d --memory 512m --memory-swap 512m myapp
# memory == memory-swap → swap байхгүй

OOMKilled — санах ой дүүрсэн

Container-ийн апп хязгаараас илүү санах ой ашиглавал Linux kernel SIGKILL дохио илгээнэ — OOMKilled (Out Of Memory Killed):

bash
docker inspect --format='{{.State.OOMKilled}}' mycontainer
# true  ← OOMKilled болсон

docker inspect --format='{{.State.ExitCode}}' mycontainer
# 137   ← SIGKILL-ийн exit код

OOMKilled болсон container-ийг илрүүлэх:

bash
# Бүх container-ийн OOM төлөв
docker inspect $(docker ps -aq) --format='{{.Name}} OOM:{{.State.OOMKilled}}'

OOMKilled шийдэх алхмууд

bash
# 1. Хичнээн санах ой ашигласныг харах
docker stats --no-stream mycontainer

# 2. Хязгаарыг нэмэх
docker run -d --memory 1g myimage

# 3. Эсвэл аппликейшний санах ой хэрэглээг оновчлох

CPU хязгаарлалт

bash
# 0.5 CPU core (50%)
docker run -d --cpus 0.5 --name myapp myimage

# 1.5 CPU core
docker run -d --cpus 1.5 --name myapp myimage

# CPU хязгаарлалтгүй — хэвийн ажиллагааг бус зөвхөн priority тохируулах
docker run -d --cpu-shares 512 myapp   # анхдагч 1024

--cpus нь хэдэн CPU core ашиглахыг хязгаарлана. 0.5 гэдэг нь 2 core дээр 25% + 25%, эсвэл 1 core дээр 50% гэсэн утгатай.

Хязгаарлалт шалгах

bash
# Тохируулсан хязгаарлалтыг харах
docker inspect --format='{{.HostConfig.Memory}}' mycontainer
# 536870912  (512MB байт-аар)

docker inspect --format='{{.HostConfig.NanoCpus}}' mycontainer
# 500000000  (0.5 CPU — nano CPU-аар)

# Бодит хэрэглээ
docker stats --no-stream mycontainer

Docker Compose-д resource хязгаарлалт

yaml
services:
  app:
    image: myapp
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

  db:
    image: postgres:16
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 1G
        reservations:
          cpus: "0.5"
          memory: 512M

limits — хамгийн их ашиглаж болох
reservations — баталгаатай нөөцлөгдөх (хамгийн бага)

Анхааруулга: deploy.resources нь Swarm mode-д бүрэн дэмжигддэг. docker compose up дээр --compatibility flag шаардагдах тохиолдол бий:

bash
docker compose --compatibility up

Эсвэл шууд mem_limit / cpus ашиглах:

yaml
services:
  app:
    image: myapp
    mem_limit: 512m
    cpus: 0.5

Практик жишээ: апп + database нөөц

yaml
services:
  nginx:
    image: nginx:alpine
    mem_limit: 64m
    cpus: 0.1

  app:
    build: .
    mem_limit: 512m
    cpus: 0.5
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16
    mem_limit: 1g
    cpus: 1.0
    environment:
      POSTGRES_PASSWORD: secret
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5

Нөөцийн хэрэглээ хянах

bash
# Бүх container-ийн нөөц бодит цагт
docker stats

# Нэг удаа хэвлэх
docker stats --no-stream

# Форматлах
docker stats --no-stream \
  --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"

Гаралт:

код
NAME       CPU %   MEM USAGE / LIMIT    MEM %
app        12.3%   145MiB / 512MiB      28.3%
db         3.1%    312MiB / 1GiB        30.5%
nginx      0.1%    8MiB / 64MiB         12.5%

Зөвлөмж

| Сервис | Memory | CPU | | ----------- | --------- | -------- | | Node.js апп | 256–512MB | 0.25–0.5 | | Python апп | 256–512MB | 0.25–0.5 | | PostgreSQL | 512MB–2GB | 0.5–1.0 | | Redis | 128–256MB | 0.1–0.25 | | Nginx | 32–64MB | 0.1 |

Эдгээр нь зөвхөн эхлэлийн утгууд — docker stats-аар хэмжиж, тохируулна.

Дараагийн хичээлд:

GitHub Actions ашиглан CI/CD pipeline-д Docker image автоматаар build ба push хийх.