본문 바로가기

DevOps/Docker

Docker 이슈 - 시스템 자원 부족 ( lack of system resources )

현상

테스트 환경 t3.medium EC2에 docker container 10개 정도를 띄워놨었고 다음 날 출근을 해보니 instance status 가 죽어 있어서 모든 연결이 끊어졌다. 그래서 로그를 살펴보니 아래와 같은 것을 발견하였다.

HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=4m40s450ms660µs405ns).

이 로그로 구글 검색을 해보면 대부분 답변이 시스템 자원이 부족해서라 한다.

시스템 자원 중에 어떤 부분이 부족하며? 이걸 방지할 수 있는 방법은 없을까?

아래 나오는 내용은 정답이 아니라 내가 스스로 검색한 부분이다. 잘못된 부분이나 잘 아신다면 댓글 부탁드립니다....

 

도커의 자원을 제한하면 될까?

아래처럼 각자 자원을 미리 나눠 할당해주면 이런 문제가 일어나지 않을까? 이건 근본적인 해결책이 아닐 것 같다.

$ docker update [변경할 자원 제한] [컨테이너 이름]
$ docker update --cpuset-cpus=1 centos

컨테이너의 메모리를 제한하는 명령어다.

$ docker run -d \       # -d 데몬 형태로 생성 
> --memory="1g" \       # --memory: 컨테이너의 메모리를 제한, 여기서는 1GB로 제한
> --memory-swap="3g" \  # --memory-swap: 스왑메모리를 설정할 수 있습니다, 여기서는 3GB로 설정했습니다.
> --name memory_1g \    # --name: 컨테이너의 이름을 설정, 여기서는 "memory_1g"가 이름
> nginx                 # 이미지는 nginx를 사용

컨테이너의 CPU 할당량

docker run -i -t --name cpu_share \   # --name: 컨테이너의 이름을 설정, 여기서는 cpu_share
> --cpu-shares 2048 \                 # --cpu-shares: CPU 할당량을 설정, 여기서는 2배 (기본값 1024)
> ubuntu:14.04                        # 이미지는 ubuntu:14.04

 

Amazon ECS를 사용할까?

나는 아직 AWS에 대한 이해도가 매우 낮다. EC2로 public/private subnet 구축 전체는 해봤지만, ECS에 대한 이해도는 0이다.

 

AWS에서 container의 health check가 가능하다고 하는데, 이게 있었다면 instance 전체가 죽는 일은 방지할 수 있었을까? 이 부분은 ECS에 대해 추가적으로 공부가 필요할 것 같다.


Amazon Elastic Container Service (ECS) now supports Docker container health checks. This gives you more control over monitoring the health of your tasks and improves the ability of the ECS service scheduler to ensure your services are healthy

https://aws.amazon.com/ko/about-aws/whats-new/2018/03/amazon-ecs-supports-container-health-checks-and-task-health-mana/

 

Amazon ECS Supports Container Health Checks and Task Health Management

Previously, the ECS service scheduler relied on the Elastic Load Balancer (ELB) to report container health status and to restart unhealthy containers. This required you to configure your ECS Service to use a load balancer, and only supported HTTP and TCP h

aws.amazon.com

ECS에서 컨테이너라는 단어를 자꾸 써서 docker와 혼동되었는데, ECS가 EC2를 도커처럼 관리하는 역할을 한다.