총 Docker 리소스를 제한하는 방법은 무엇입니까?

총 Docker 리소스를 제한하는 방법은 무엇입니까?

Docker에서 액세스할 수 있는 총 리소스를 제한하려고 합니다(예: RAM의 90% 및 CPU의 1500%만). 컨테이너를 시작할 때 CPU 및 RAM 제한을 사용할 수 없기 때문에 Docker 컨테이너에 사용 가능한 총 리소스를 제한해야 합니다.

최대 CPU와 메모리를 사용할 수 있지만 동시에는 사용할 수 없는 약 20개의 컨테이너가 있으므로 CPU 및 RAM 제한을 설정할 수 없으므로 docker에서 사용하는 총 리소스를 제한해야 합니다.

먼저 슬라이스를 만들었습니다. 위의 지침을 시도했지만 RAM과 CPU 사용량을 동시에 제한할 수 없었습니다.

# /etc/systemd/system/docker_limit.slice
[Unit]
Description=Slice that limits docker resources
Before=slices.target

[Slice]
CPUAccounting=true
CPUQuota=700%
#Memory Management
MemoryAccounting=true
MemoryHigh=20G
MemoryMax=25G
MemoryMaxSwap=10G

그리고 내 daemon.json

{
  "insecure-registries" : [ "url1", "url2"],
  "cgroup-parent": "docker_limit.slice"
}

하지만 컨테이너에서 시도하면 다음과 같습니다.

stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

Docker 통계를 보면 111Go의 Ram(내 서버의 전체 용량)을 사용하고 있음을 알 수 있습니다.

stress --cpu 16

Docker 통계를 보면 사용량이 1600%(내 서버의 전체 용량)에 가깝다는 것을 알 수 있습니다.

뭔가 빠진 것 같은데 뭔지 모르겠어요

답변1

이 질문에 대한 완전한 답변이 필요한 다른 사람을 위해 전체 검토를 수행하고 있습니다.

먼저 docker_limit라는 슬라이스를 만들었습니다.

  1. 파일을 생성하여/etc/systemd/system/docker_limit.slice

    [Unit]
    Description=Slice that limits docker resources
    Before=slices.target
    
    [Slice]
    CPUAccounting=true
    CPUQuota=700%
    #Memory Management
    MemoryAccounting=true
    MemoryLimit=25G
    
  2. 시작 장치:systemctl start docker_limit.slice

  3. 편집하다/etc/docker/daemon.json

    {
      "cgroup-parent": "docker_limit.slice"
    }
    
  4. Docker 데몬을 다시 시작합니다.systemctl restart docker

모든 것이 예상대로 작동하는지 확인하려면 systemd-cgtop아래 나열된 프로세스를 확인해야 합니다 docker_limit.slice. 예를 들어: 여기에 이미지 설명을 입력하세요.

@rwos에 대한 크레딧

답변2

cgroup_parentcgroup 이름이 절대적이 되도록 /etc/docker/daemon.json접두사를 붙 입니다 . /그렇지 않으면 docker는 컨테이너를 데몬 cgroup의 하위 cgroup에 배치합니다.

{
    "cgroup-parent": "/docker_limit.slice"
}

그렇지 않은 경우 /시스템에 따라 컨테이너가 /system.slice/containerd.service/docker_limit.slice유사한 상황에 처할 수 있습니다.

systemd-cgtop또는 systemd-cgls작업이 종료되는 위치를 확인하는 데 사용할 수 있습니다.

답변3

CPU 1개와 RAM 2GB(스왑 비활성화됨)를 갖춘 가상 머신이 있습니다.
그래서 다음 매개변수를 사용하여 슬라이스를 만들었습니다.

# cat /etc/systemd/system/docker_limit.slice
[Unit]
Description=Slice that limits docker resources
Before=slices.target

[Slice]
CPUAccounting=true
CPUQuota=90%
MemoryAccounting=true
MemoryHigh=1G
MemoryMax=1.2G

데몬의 기본 cgroupdriver를 제외하고는 여러분과 동일한 작업을 수행했습니다.

# cat /etc/docker/daemon.json 
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "cgroup-parent": "docker_limit.slice"
}

그런 다음 Docker 컨테이너를 실행합니다.

docker run --name stress-test -d ubuntu:18.04 sleep 10000

2개의 창에서 내 가상 머신을 엽니다. 첫 번째 창에서 stress. 두 번째 창에서 docker stats commandCPU는 약 90%+-였습니다(htop에서 확인했는데 91%까지 치솟는 것을 확인했습니다). RAM이 1.2G에 도달하면 다음 메시지와 함께 프로세스가 종료되었습니다.

# stress --cpu 1 --vm 1 --vm-bytes 1300M
stress: info: [334] dispatching hogs: 1 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [334] (415) <-- worker 336 got signal 9
stress: WARN: [334] (417) now reaping child worker processes
stress: FAIL: [334] (451) failed run completed in 4s

답변4

rwos의 위 제안(불행히도 게시물에 직접 댓글을 달 수 없음)은 저에게 적합하지 않습니다.

/etc/docker/daemon.json에서 cgroup_parent 접두사에 /를 붙여 cgroup 이름이 절대적이 되도록 합니다.

다음 오류가 발생합니다.

데몬의 오류 응답: 컨테이너에 대한 작업을 생성할 수 없습니다: shim 작업을 생성할 수 없습니다: OCI 런타임 생성 실패: runc 생성 실패: 잘못된 슬라이스 이름: /docker_limit.slice: 알 수 없음

내 도커 컨테이너는 "/" 접두사 없이 시작됩니다. 그것으로는 그렇지 않을 것입니다.

관련 정보