서버 시스템을 운영하면 자원 사용량이나 활용도를 모니터링하는데 다음의 도구들을 종종 사용한다.
~# top
apt -y install htop
~# htop
apt -y install sysstat
~# sar 2 10
(2초 간격으로 10초 동안 수집)~# iostat 2 10
~# vmstat 2 10
~# free -mt
(마지막 사용량은 MB 단위로 표시)apt -y install dstat
~# distat
apt -y install iptraf-ng
~# iptraf-ng
컨테이너를 호스트 OS에서 실행한 경우에도 위 도구들을 사용할 수 있다. (컨테이너는 프로세스)
- 컨테이너를 생성할 때 자원 할당 제어를 사용해야 한다.
- 자원 할당 제어를 사용하지 않으면 컨테이너는 호스트 OS의 모든 자원을 자유롭게, 과도하게 사용할 수도 있다.
- 컨테이너는 대부분 소규모 애플리케이션 서비스이기에 자원 할당을 잘못하면 호스트 OS 전반이 영향 받는다.
- 컨테이너 생성 시 도커에서 제공하는 여러 런타임 제약 옵션으로 자원 운영을 설정할 수 있다.
- 컨테이너 생성 후에도
docker update
로 변경 가능- 이러한 리소스 런타임 제약은 리눅스 커널이 제공하는 cgroup 기능을 통해 가능
```docker
$ grep cgroup /proc/mounts
$ docker info | grep Cgroup
Ggroup Driver: croupfs
Cgroup Version: 1
```
- croup 기능이 비활성화된 경우 출력 마지막에 경고 표시가 나타나거나 컨테이너를 생성하는 `docker run` 이후에 세부 경고 표시가 출력된다.
—cpus
: 컨테이너가 사용 가능한 CPU 리소스 양을 지정
—cpus=0.2
: 1개의 CPU를 사용하는 경우 20%까지 사용 가능—cpus=1.5
: 여러 CPU를 사용 중인 경우 1.5개의 CPU 사용 보장—cpu-period
: CPU CFS 기간 제한 옵션으로 컨테이너의 CFS는 100ms로 지정. (일반적으로 변경하지 않고 사용)
—cpu-quota
: —cpu-period
에 설정된 시간은 CPU 스케줄링에 얼마나 할당할지를 결정
# 1개의 CPU 사용 시 컨테이너가 100ms마다 런타임의 50%를 CPU에 할당
# --cpus=0.5와 동일
$ docker run -it \
> --cpu-period=100000 \
> --cpu-quota=50000 \
> ubuntu:14.04 /bin/bash
# 일반적으로 --cpus 이용을 권장
—cpuset-cpus
: 호스트 OS에 여러 CPU를 사용하는 경우 특정 코어 번호를 지정하여 사용 제한 (0부터 시작)
—cpuset-cpus=”0,3”
→ 1, 4번째 CPU 사용—cpuset-cpus=”0-2”
→ 1, 2, 3번째 CPU 사용—cpu-shares
만일 호스트 시스템의 메모리 부족을 감지하면 OOME(Out Of Memory Exception)를 발생시키고 메모리 확보를 위해 프로세스를 종료한다.
-m
또는—memory
- 컨테이너가 사용할 수 있는 최대 메모리 크기를 정할 수 있다.’
- 허용되는 최솟값은 4m(4MB)
—memory-swap
- 컨테이너가 디스크로 스왑할 수 있는 메모리양 지정
- 0이면 컨테이너 스왑 사용 해제, -1이면 무제한으로 설정
—kernel-memory
- 컨테이너가 사용할 수 있는 최대 커널 메모리양 지정
—blkio-weight
: 블록 IO 할당량은 10~1000 사이 가중치 값 허용—blkio-weight-device
: 블록 IO 할당량을 제한할 대상 디바이스 지정—device-read-bps
: 장치의 초당 읽기 속도 제한—device-write-bps
: 장치의 초당 쓰기 속도 제한—device-read-iops
: 장치의 초당 읽기 I/O양 제한—device-write-iops
: 장치의 초당 쓰기 I/O양 제한서버 컨테이너 상관 없이 제한된 자원이라는 환경에서 애플리케이션을 운영하는 경우 항상 제약을 통해 호스트 시스템 및 다른 컨테이너 서비스에 영향을 미치지 않도록 자원 제약에 관심을 가져야 한다.