본문 바로가기

Docker

컨테이너 용량이 계속해서 증가하는 문제에 대한 해결책

728x90

안녕하세요.

일평균 접속이 100,000건 이상, 동시접속이 1,000건 이상인 어린이집 출결관리 시스템을 운영 중에 알 수 없는 문제가 발생하였습니다.

 

문제

문제는 컨테이너 용량이 계속해서 증가한다는 것이었는데요.

Root FS 사용량이 계속해서 늘어나요... feat. Grafana

 

초기에는 원인 파악이 어려워 일단 호스트 파티션 용량을 늘려 조치를 하고 원인을 분석한 결과 문제는 Docker 이미지의 /tmp 디렉토리였습니다.

 

저희는 AWS S3를 사용하고 있으니 용량 문제는 발생하지 않을 거라고 생각했지만, 사실 어린이집에서 업로드하는 영상이나 사진들이 모두 호스트를 거쳐 S3에 업로드되는 구조다 보니 임시 파일(/tmp)이 계속해서 쌓이더군요.

 

더군다나 리눅스에서 /tmp 경로는 시스템이 재부팅될 때 청소가 된다고 하니 무중단 시스템에서는 정기적으로 청소를 해 주는 방법밖에는 없는 것 같습니다. (관련하여 오류가 있다면 지적해주세요.)

 

해결책

그래서 저희는 해당 Docker 이미지 내에 cron 을 이용해 주기적으로 /tmp 디렉토리를 비워주기로 결정하였습니다.

 

아래와 같이 tmp-clean.cron 이라는 파일을 만들고 /tmp 경로에 쌓인 파일 중 마지막 액세스 일시가 1시간(60분)이 넘어간(-amin +60) 모든 파일을 삭제하도록 하였습니다.

(1시간이라는 조건을 준 이유는 사용자가 파일을 업로드 하는 시점과 cron 작업이 동작하는 시점이 겹치게 되면 쓰려는자와 지우려는자의 대결이 이루어짐으로써 결함을 유발할 수 있기 때문입니다.)

#!/bin/bash
0 * * * * find /tmp -type f -amin +60 -delete

 

아래와 같이 Dockerfile에 cron을 설치하고 매 시간 동작하도록 등록을 해 주었습니다.

RUN apt-get update
RUN apt-get install -y cron

ADD tmp-clean.cron /etc/cron.d/tmp-clean.cron
RUN chmod 775 /etc/cron.d/tmp-clean.cron
RUN crontab /etc/cron.d/tmp-clean.cron

 

이렇게 우리의 골치거리가 하나 더 해결되었답니다^^

728x90