ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker Container 리소스 관리
    Docker 2019. 10. 1. 12:41

    CPU 리소스 관리

    Dokcer Container는 Host의 CPU 자원을 제한없이 사용할 수 있다. 자원 사용의 제한이 없기 때문에 하나의 컨테이너가 수행될 때 CPU-Intensive한 작업을 수행하게 되면 호스트 머신의 모든 CPU 자원을 점유하여 다른 컨테이너의 동작을 방해하는 현상이 발생할 수 있다. 이러한 현상을 방지하기 위해 CPU 사이클에 대한 Quota를 적용이 필요하다.

     

    Docker는 기본적으로 CFS(Completely Fair Scheduler) 스케줄러를 사용하며, 1.13 Version+에서는 실시간 스케줄러를 이용할 수 있다.

    CFS 스케줄러

    옵션 설명
    --cpus=<number>

    현재 실행하고자 하는 컨테이너가 최대 몇 개의 CPU를 사용할 것인지 명시한다.

    [ --cpus="1.5" ] = [ --cpu-period="100000" ] + [ --cpu-quota="150000" ]

    --cpu-period=<number>

    CPU CFS 스케쥴러 Period를 의미하며, --cpu-quota 옵션과 같이 사용된다.

    단위는 마이크로초로 표현된다.

    --cpu-quota=<number>

    CPU CFS Quota를 의미하며, 입력한 값은 --cpu-perioa로 입력한 값 중 얼마를 컨테이너에게 할당할 것인가를 의미한다.

    즉, 실제로 사용할 리소스의 퍼센트 = quota / period

    --cpuset-cpus

    컨테이너가 사용할 수 있는 CPU or 코어를 제한하며, 코어의 인덱스는 0부터 시작

    [ ex : 코어가 4개인 호스트 머신에서 --cpuset-cpus="0,2" 옵션을 사용할 경우 첫 번째, 세 번째 코어를 사용하도록 명시한 것 ]

    --cpu-shares

    컨테이너를 실행할 때 고려할 가중치를 의미하며 설정한 값은 상대적으로 사용된다.

    기본값은 1024이며 2048로 설정 시 기본 값보다 두 배 많은 CPU 자원을 할당한다. 이 설정 값은 리눅스 커널의 cgroups에서 사용된다.

     

    cgroup의 CPU Share은 현재 생성되어 있는 컨테이너들이 Share 값의 비율에 따라 호스트의 CPU를 CFS 방식으로 나눠서 사용한다.

    실시간 스케줄러

    < CONFIG_RT_GROUP_SCHED 가 설정되어 있어야 한다. >

    옵션 설명
    --cpu-add=sys-nice

    컨테이너에게 CAP-SYS-NICE를 할당한다.

    CAP-SYS-NICE는 컨테이너가 프로세스의 nice(우선순위)값을 올릴 수 있도록 허용하는 것이다.

    --cpu-rt-runtime=<num> --cap-add=sys_nice를 명시해야 하며, 컨테이너가 도커 데몬의 실시간 스케쥴러 period 동안 수행할 마이크로 초 값을 명시할 수 있다.
    --ulimit rtprio=<num> --cap-add=sys_nice를 명시해야 하며, 실시간 우선순위의 최대 값 명시

     


    메모리 관리

    Docker는 컨테이너의 메모리 사용량의 Hard Limit 혹은 Soft Limit을 지정할 수 있다.

    Hard Limit : 컨테이너는 지정된 메모리량 이상을 사용할 수 없다.

    Soft Limit : 필요한 만큼 메모리를 이용하다가 커널이 호스트머신의 메모리가 부족하거나 컨텐션이 몰릴 경우 제한

    옵션 설명
    -m || --memory=<value>

    컨테이너가 사용할 최대 메모리 양을 지정한다.

    옵션 지정시, 최소 값은 4MB 이다.

    --memory-swap

    --memory 옵션과 함께 사용되며 컨테이너가 사용할 스왑 메모리 영역을 설정할 수 있다.

    컨테이너가 할당된 메모리를 모두 사용한 경우에도 디스크 공간을 사용할 수 있도록 해준다.

    스왑 공간을 자주 사용하는 것은 성능 저하를 일으키기 때문에 사용을 지양해야 한다.

    --memory-swappiness

    기본적으로 호스트 OS의 커널은 컨테이너의 Anonymous Page의 일정 퍼센트를 스왑 아웃할 수 있다. [ 0 ~ 100 ]

    0 : anonymous page 스왑 기능 off

    100 : 모든 anonymous page들이 스왑 아웃 가능

    설정하지 않으면 호스트 운영체제의 설정 값이 상속되어 사용된다.

    --memory-reservation

    --memory 설정으로 명시한 값보다 작은 값의 soft limit을 명시할 수 있다.

    Docker가 contension을 감지하거나 host에서 메모리 가용률이 낮아졌을 때 활성화되며, 이 값은 --memory 설정 값보다 반드시 작아야 한다.

    --kernel-memory

    컨테이너가 사용할 수 있는 커널 메모리 양을 지정하며, 최소 값은 4MB 이다.

    커널 메모리는 스왑 아웃 되지 않기 때문에 지나치게 크게 지정해서는 안된다.

    --oom-kill-disable OOM(Out-Of-Memory)이 발생했을 때, 커널이 컨테이너에 존재하는 프로세스를 죽일 것인지 지정할 수 있는 옵션. default = false

     

    [ 참고 ]

    https://m.blog.naver.com/complusblog/220994619068

    'Docker' 카테고리의 다른 글

    Containerd VS Docker  (0) 2022.08.08

    댓글

Designed by Tistory.